Kubernetes(k8s)
mysql -h 10.4.0.44 -u root -psawXG841rxhistory查询历史命令kubectl apply -f ingress.yamlvim ingress.yamlhistory | grep mysqlhistory | grep mysqlcurl -I htps://ctrain-live.tgovcloud.comcurl -I htps://ctrain-l
文章目录
彻底搞懂k8s网络
Kubernetes网络三部曲之一~Pod网络
【深入理解Kubernetes网络-哔哩哔哩】 https://b23.tv/QOJ3zMc
【Ingress Controller 的工作原理-哔哩哔哩】 https://b23.tv/RafCHrC
【什么是 Ingress 服务-哔哩哔哩】 https://b23.tv/uv1hOFU
错误记录
1 node(s) had taints that the pod didn’t tolerate
节点有了污点无法容忍,执行kubectl get no -o yaml | grep taint -A 5 之后发现该节点是不可调度的。这是因为kubernetes出于安全考虑默认情况下无法在master节点上部署pod【文章链接:https://blog.csdn.net/erhaiou2008/article/details/103907289】
nodePort拒绝访问的问题,pod网络不通的问题排查思路:https://blog.csdn.net/weixin_38380858/article/details/88830853
k8s命令收集
kubectl get namespace
kubectl create namespace test-env
//想看所有Pod都在哪些节点上运行
kubectl get pod -A -o yaml |grep '^ n'|grep -v nodeSelector|awk 'NR%3==1{print ++n"\n"$0;next}1' 1
//过滤掉系统的pod
kubectl get pod -A |grep -v kube-system
kubectl get pod -A
环境清理
kubectl delete svc --all
kubectl delete pod --all
kubectl delete cm --all
kubectl delete deployment --all
svc即service的缩写
kubectl delete svc demo1 demo2 demo3
kubectl delete deployment demo1 demo2 demo3 --grace-period=0 --force
kubectl create configmap demo-br --from-file=app/bootstrap.yaml
kubectl get configmap --all-namespaces
kubectl describe configmap demo-ap
minikube start
//因为pod都删除了,对应的service就没有用了
//如果只删除pod,deployment会自动重建,所以应该先删除deployment
//所以创建关系是deployment---创建pods---生成service
ingress
ingress controller
nginx匹配域名是hash表,匹配路径是多叉树,把pod理解成主机,它有ip
service工作原理与手动配置endpoint资源
configMap使用方法
kubectl create configmap demo-br --from-file=app/bootstrap.yaml
kubectl get configmap --all-namespaces
kubectl describe configmap demo-ap
kubectl describe pod demo2-6886cf9fbf-x4jlb
helm命令大全
服务升级:helm upgrade nginx nginx
helm install的多种方式
补充:其实部署有多种方式:
指定chart: helm install stable/mariadb
指定打包的chart: helm install ./nginx-1.2.3.tgz
指定打包目录: helm install ./nginx
指定chart包URL: helm install https://example.com/charts/nginx-1.2.3.tgz
如果要覆盖chart中的默认值,通过指定配置文件方式 helm install -f myvalues.yaml ./redis
或通过–set key=value方式 helm install --set name=prod ./redis
例:helm install -n mysql -f mysql/values.yaml --set resources.requests.memory=512Mi mysql
k8s 资源清单-常用字段解释
helm里的yaml的介绍
chart–服务部署deployment.yaml,服务发现service.yaml和反向代理ingress.yaml
k8s解惑
k8s-集群里的三种IP(NodeIP、PodIP、ClusterIP)【https://blog.csdn.net/qq_21187515/article/details/101363521】
将服务暴露给外部的方式主要有三种[https://blog.csdn.net/Alexbyy/article/details/108569270]
Helm 3安装Nginx Ingress Controller和使用【https://blog.csdn.net/twingao/article/details/105157724】
Helm Chart 使用简析【https://blog.csdn.net/qq_39680564/article/details/107388151?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen】
【K8S 命名空间 (namespace)】(https://blog.51cto.com/u_13760351/2622839)
【kubernetes资源对象与基本概念解析】(https://www.cnblogs.com/peteremperor/p/12184361.html)
chart 4种模版赋值
以部署为例
#test-pod
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: test-pod #资源的名字,在同一个namespace中必须唯一
labels: #设定资源的标签
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定义注解列表
- name: String #自定义注解名字
spec: #specification of the resource content 指定该资源的内容
restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器
nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: test-pod #容器的名字
image: 10.192.21.18:5000/test/chat:latest #容器使用的镜像地址
imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT
args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数
env: #指定容器中的环境变量
- name: str #变量的名字
value: "/etc/run.sh" #变量的值
resources: #资源管理
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
limits: #资源限制
cpu: 0.5
memory: 1000Mi
ports:
- containerPort: 80 #容器开发对外的端口
name: httpd #名称
protocol: TCP
livenessProbe: #pod内容器健康检查的设置
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过tcpSocket检查健康
# port: number
lifecycle: #生命周期管理
postStart: #容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop:#容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts: #挂载持久存储卷
- name: volume #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /data #挂载到容器的某个路径下
readOnly: True
volumes: #定义一组挂载设备
- name: volume #定义一个挂载设备的名字
#meptyDir: {}
hostPath:
path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
#nfs
helm命令大全
https://blog.csdn.net/boganquan8199/article/details/100964828
密码
您必须使用sudo以下命令运行脚本:
sudo /path/to/script
但是在您必须允许jenkins在中运行脚本之前/etc/sudoers。
jenkins ALL = NOPASSWD: /path/to/script
Linux 下以其他用户身份运行程序—— su、sudo、runuser
su 对切换到超级权限用户 root 后,权限的无限制性,所以 su 并不能担任多个管理员所管理的系统。如果用 su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限–sudo登陆
sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户,而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权。默认只有 root 用户能使用 sudo 命令,普通用户想要使用 sudo,是需要 root 预先设定的,默认 root 能够 sudo 是因为这个文件中有一行”root ALL=(ALL) ALL”。
cat /etc/shadow
jenkins
cat /etc/passwd
cat /etc/shadow
authconfig --test | grep hashing
jenkins:解决root无法su到jenkins用户(jenkins运行权限问题)—https://blog.csdn.net/weixin_43819222/article/details/91038426
新建了一个用户,没有设置密码的话,密码就是未知数。
这个用户没法直接登录,使用root用户su 的除外。
一般的话:useradd 和passwd是一对一对的出现,建一个用户就得设置这个用户的密码。
l
inux 如何禁用账号和解除禁用账号
把账号禁用可以有几个方法:
-
usermod -L
usermod -U // 解除禁用
- 修改/etc/passwd文件,可以有几个地方
1)把第二个字段中的"x"变成其它的字符,该账号就不能登录
2)把/bin/bash修改成/sbin/nologin - 修改/etc/shadow文件
1)在第二个密码字段的前面加上一个“!”,该账号就不能登录,这个其实就是usermod -L命令的结果
2)在最后两个冒号之间加上数字"1",表示该账号的密码自1970年1月1日起,过一天后立即过期,当然现在自然就不能登录了。
如果想解禁,把修改的东西去掉就可以了。
密码域密文也是由三
部分组成的,即:$ id$ salt$ encrypted。 DES和明文开头无标记 id为1时,采用md5进行加密; id为5时,采用SHA256进行加密; id为6时,采用SHA512进行加密
[将jenkins配置成root身份登陆系统-修改用户为root (避免权限导致的问题)](jenkins 配置root用户)
把账号禁用可以有几个方法:
usermod -L
usermod -U // 解除禁用
2. 修改/etc/passwd文件,可以有几个地方
1)把第二个字段中的"x"变成其它的字符,该账号就不能登录
2)把/bin/bash修改成/sbin/nologin
3. 修改/etc/shadow文件
1)在第二个密码字段的前面加上一个“!”,该账号就不能登录,这个其实就是usermod -L命令的结果
2)在最后两个冒号之间加上数字"1",表示该账号的密码自1970年1月1日起,过一天后立即过期,当然现在自然就不能登录了。
如果想解禁,把修改的东西去掉就可以了。
笔记
vim 的全局替换
:%s/web-demo/{{name}}/g
project_name
image_name
cat .kube/config
拿到配置文件
vi .kube/config
自动部署
agent 说明流水线哪一个节点运行,声明式不能写变量和if-else判断语句,这个问题可以结合script来弥补
部署完成后需要做些善后事情,比如发邮件,成功失败的归档,
pipeline {
agent any
environment {
cc = 'clang'
}
stages {
stage('build') {
steps{
echo "variable is ${cc}"
// exit 1 这是回报异常,说没有exit,这时post.failure就会被调用
// git 'https://gitee.com/goodshred/k8s-hello-world.git'
// sh "mvn -Dmaven.test.failure.ignore=true clean package"
script {
def browsers = ['chrome', 'firefox']
for (int i = 0; i < browsers.size(); ++i) {
echo "Testing the ${browsers[i]} browser"
}
}
}
}
}
post {
success {
script {
echo "post==success"
}
}
failure {
script {
echo "post==failure"
}
}
//构建不稳定时
//随着项目的开发和持续扩展,使用Jenkins构建(build)项目越来越多,Jenkins服务器的磁盘可能被大日志文件占满造成无法继续构建项目的异常(一般会出现构建按钮为黄色)
unstable {
script {
echo "post==unstable "
}
}
}
}
jenkins使用
chmod +x 给脚本提前加权限
docker build xxx .
docker login xxx.com
JOB_NAME是Jenkins自带的全局变量
WORKSPACE是jenkins的工作空间,module是模块名
即创建一个ci,cd
点击可查看更多流水线语法:http://192.168.177.201:18080/job/k8s-web-demo/pipeline-syntax/
jenkins自动化部署
centOS7下使用yum安装jenkins以及运行jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins
rpm -ql jenkins 查看安装信息
vi /etc/sysconfig/jenkins 可修改jenkins配置(端口号…我该成了18080)【JENKINS_USER=“root” 它默认会在linux上创建jenkins,但该用户权限贼低,改成root则会受很少限制–改完重启服务】
启动 | 停止 | 重启 | 查看状态 jenkins:
systemctl start | stop | restart | status jenkins
安装相关的字体包和相关字体管理包,还有一些openJDK不带有的相关库
sudo yum install dejavu-sans-fonts
sudo yum install fontconfig
sudo yum install xorg-x11-server-Xvfb
然后使用service start jenkins或者systemctl start jenkins启动,这时用lsof -i:18080是查不到服务的,需要先在浏览器访问18080,这是Jenkins才会启动一系列服务,该过程需要等待1-2分钟,这时在lsof -i:18080是可以看到内容的。
新建了一个用户,没有设置密码的话,密码就是未知数。
这个用户没法直接登录,使用root用户su 的除外。
一般的话:useradd 和passwd是一对一对的出现,建一个用户就得设置这个用户的密码。
CI CD
docker-maven-plugin插件打包Docker镜像
一个自动部署就是一个jobs,
持续集成,持续发布的意思
改了dns或者主机域名,这就导致环境不可控
k8s单机版一键安装
Kubernetes单机部署-一键安装
docker卸载(如果原机器有的话)
yum list installed|grep docker
yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64
yum -y remove containerd.io.x86_64
rm -rf /var/lib/docker/
docker --version
创建install-k8s.sh安装脚本
#!/bin/sh
# ----------------------------------------
# k8s单机版一键安装脚本
# author wangll
# date 2019-08-11
# 执行本脚本时如果报错:找不到解释器,执行:sed -i 's/\r$//' install-k8s.sh
# 参考:https://www.missshi.cn/api/view/blog/5b0e8af013d85b22bc000001
# ----------------------------------------
# 1 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
# 2 禁用SELINUX
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 3 升级yum,一般不需要,这步很耗时,非必要
# yum -y update
# 4 安装etcd和Kubernetes(自动附带安装Docker)
yum install -y etcd kubernetes
# 5 修改/etc/sysconfig/docker文件。修改OPTIONS的内容为:
sed -i "s/--selinux-enabled --log-driver=journald --signature-verification=false/--selinux-enabled=false --insecure-registry gcr.io/g" /etc/sysconfig/docker
# 6 修改/etc/kubernetes/apiserver文件。修改KUBE_ADMISSION_CONTROL的内容为:
sed -i "s/--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota/--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota/g" /etc/kubernetes/apiserver
# 7 依次启动下列服务:
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
# 8 解决创建的pod一直是ContainerCreating状态,ready数一直为0的问题。参考:https://blog.csdn.net/qq_38695182/article/details/82971114
yum install -y *rhsm*
yum install -y wget
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
rm -rf python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
# 9 设置允许转发,否则会造成“服务都已经启动好了,但是外界无法访问”。参考https://blog.csdn.net/weixin_38698322/article/details/91155594
iptables -P FORWARD ACCEPT
检验是否安装成功
kubectl get rc,services
注意:
电脑重启后,k8s的服务也会关闭,执行kubectl命令会报链接8080失败,这时候需要启动kubectl服务
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
有时候还可能是如下原因造成
The connection to the server localhost:8080 was refused - did you specify the right host or port?解决
我的文件是/etc/kubernetes/config
部署springboot项目到k8s中
vi dockertest.yaml
apiVersion: v1
kind: Service
metadata:
name: dockertest
namespace: default
labels:
app: dockertest
spec:
type: NodePort
ports:
- port: 30009
targetPort: 9999
# type: NodePort # 在主机上暴露端口
nodePort: 9999 #service对外开放端口
selector:
app: dockertest
---
apiVersion: extensions/v1beta1
#apps/v1,extensions/v1beta1需要根据自己k8s的版本选择
kind: Deployment #对象类型
metadata:
name: dockertest #名称
labels:
app: dockertest #标注
spec:
replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量
selector:
matchLabels:
app: dockertest
template:
metadata:
labels:
app: dockertest
spec:
containers: #docker容器的配置
- name: dockertest
image: goodshred/hello-world:latest # 192.168.1.253:8081/pasq/dockertest:0.0.1 # pull镜像的地址 ip:prot/dir/images:tag
imagePullPolicy: IfNotPresent #pull镜像时机,
ports:
- containerPort: 9999 #容器对外开放端口
将默认的对外暴露端口的范围30000-32767修改成1-6万,
vi /etc/kubernetes/apiserver
追加配置:–service-node-port-range=1-65535
systemctl restart kube-apiserver
kubectl apply -f dockertest.yaml # 创建/更新
lsof -i:9999
docker build xxx .以及dockerignore 文件
指定docker镜像中的根路径,比如./resource,-t参数即说明tag版本号,-f :指定要使用的Dockerfile路径;
docker build 最后的 . 号,其实是在指定镜像构建过程中的上下文环境的目录。理解了上面的这些概念,就更方便的去理解 .dockerignore 文件的作用了。比如说 dockerfile 中的 COPY ./package.json /project,其实拷贝的并不是本机目录下的 package.json 文件,而是 docker引擎 中展开的构建上下文中的文件,所以如果拷贝的文件超出了构建上下文的范围,Docker引擎 是找不到那些文件的。
k8s中文手册以及学习视频
k8s中文手册
Kubernetes/k8s生产级从部署到核心应用
部署链接https://gitee.com/pa/kubernetes-ha-kubeadm-private/blob/kubernetes-1.14/docs/1-prepare.md
架构设计
ETCD:作为数据持久化,防止k8s上数据重启丢失
schduling调度器:根据cpu,内存等指标选择最优节点进行节点pod的创建
controllerMannager(serviceController,podController,sourceController(管理资源内容的))
kubelet负责维护pod的生命周期(网络)
K8s(Kubernetes)架构学习笔记(https://blog.csdn.net/gongxsh00/article/details/79932136?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen)
有一堆客人来了(镜像容器/资源清单/yaml文件),他先要到酒店的前台/接待大厅(api-server)去进行登记信息登记(etcd),完事执行部署(deployment),控制器(controller)说,我要分配几个房间(replisetController,客户的大件物品我要存在哪里(PersistVolumeController),要跟踪客人的状态(预订,住房,退房) 调度器(scheduler)决定说把你分配到哪个房间,大老板就是vip房间。一般人就是普通房间
(专业人员的命令都来自于api-server下发的)每个房间都会有专门人员负责服务(service),刷卡(kubelet)就可以启动房间内设备运转,像灯,电视等
节点ip,集群ip,额外ip
一个pod有一个pause容器,它有一个ip,叫(pod ip有真实node宿主机的网卡提供支持),pod里面的其它容器共享该ip,他们彼此间直接通过端口通信,有cluster ip集群ip,它是由iptable防火墙虚拟出来的,逻辑上的,extra ip这是给service提供外部访问的ip,方式有2种:通过设置nodePort映射到物理机,同时设置Service的类型为NodePort。通过设置LoadBalancer映射到云服务上提供的LoadBalancer地址
k8s命令大全
https://blog.csdn.net/liumiaocn/article/details/73913597可做参考
kubectl delete pods 节点名—》改操作可以直接删除Evicted 挂掉的节点,但是处于running的节点由于
replicas副本机制,会再马上启动副本,因此并不能完全删除
可以执行如下操作进行强删
kubectl get deployment 获取到节点名
kubectl delete deployment 节点名 --grace-period=0 --force 【grace-period优雅停止,–force 强行删除,避免确保机制,保证完全删除】
删除节点(等同于强删服务节点)
kubectl delete deployment unified-file-service -n gasc-test
kubectl get deployments -n gasc-test 查看服务发布状态
get pod -o wide 详情
# 查看命名空间,查看所有资源
kubectl get namespaces
kubectl get all -n tgac 等价于 kubectl get all --namespace=tgac
# 查看所有namespace的pods运行情况
kubectl get pods --all-namespaces
# 查看具体pods,记得后边跟namespace名字哦
kubectl get pods kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system
# 查看pods具体信息
kubectl get pods -o wide kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system
# 查看集群健康状态
kubectl get cs
# 获取所有deployment
kubectl get deployment --all-namespaces
# 查看kube-system namespace下面的pod/svc/deployment 等等(-o wide 选项可以查看存在哪个对应的节点)
kubectl get pod /svc/deployment -n kube-system
# 列出该 namespace 中的所有 pod 包括未初始化的
kubectl get pods --include-uninitialized
# 查看deployment()
kubectl get deployment nginx-app
# 查看rc和servers
kubectl get rc,services
# 查看pods结构信息(重点,通过这个看日志分析错误)
# 对控制器和服务,node同样有效
kubectl describe pods xxxxpodsname --namespace=xxxnamespace
# 其他控制器类似吧,就是kubectl get 控制器 控制器具体名称
# 查看pod日志
kubectl logs $POD_NAME
# 查看pod变量
kubectl exec my-nginx-5j8ok -- printenv | grep SERVICE
# 集群
kubectl get cs # 集群健康情况
kubectl cluster-info # 集群核心组件运行情况
kubectl get namespaces # 表空间名
kubectl version # 版本
kubectl api-versions # API
kubectl get events # 查看事件
kubectl get nodes //获取全部节点
kubectl delete node k8s2 //删除节点
kubectl rollout status deploy nginx-test
kubectl get deployment --all-namespaces
kubectl get svc --all-namespaces
# 创建
kubectl create -f ./nginx.yaml # 创建资源
kubectl apply -f xxx.yaml (创建+更新,可以重复使用)
kubectl create -f . # 创建当前目录下的所有yaml资源
kubectl create -f ./nginx1.yaml -f ./mysql2.yaml # 使用多个文件创建资源
kubectl create -f ./dir # 使用目录下的所有清单文件来创建资源
kubectl create -f https://git.io/vPieo # 使用 url 来创建资源
kubectl run -i --tty busybox --image=busybox ----创建带有终端的pod
kubectl run nginx --image=nginx # 启动一个 nginx 实例
kubectl run mybusybox --image=busybox --replicas=5 ----启动多个pod
kubectl explain pods,svc # 获取 pod 和 svc 的文档
# 更新
kubectl rolling-update python-v1 -f python-v2.json # 滚动更新 pod frontend-v1
kubectl rolling-update python-v1 python-v2 --image=image:v2 # 更新资源名称并更新镜像
kubectl rolling-update python --image=image:v2 # 更新 frontend pod 中的镜像
kubectl rolling-update python-v1 python-v2 --rollback # 退出已存在的进行中的滚动更新
cat pod.json | kubectl replace -f - # 基于 stdin 输入的 JSON 替换 pod
# 为 nginx RC 创建服务,启用本地 80 端口连接到容器上的 8000 端口
kubectl expose rc nginx --port=80 --target-port=8000
# 更新单容器 pod 的镜像版本(tag)到 v4
kubectl get pod nginx-pod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -
kubectl label pods nginx-pod new-label=awesome # 添加标签
kubectl annotate pods nginx-pod icon-url=http://goo.gl/XXBTWq # 添加注解
kubectl autoscale deployment foo --min=2 --max=10 # 自动扩展 deployment “foo”
# 编辑资源
kubectl edit svc/docker-registry # 编辑名为 docker-registry 的 service
KUBE_EDITOR="nano" kubectl edit svc/docker-registry # 使用其它编辑器
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #修改启动参数
# 动态伸缩pod
kubectl scale --replicas=3 rs/foo # 将foo副本集变成3个
kubectl scale --replicas=3 -f foo.yaml # 缩放“foo”中指定的资源。
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 将deployment/mysql从2个变成3个
kubectl scale --replicas=5 rc/foo rc/bar rc/baz # 变更多个控制器的数量
kubectl rollout status deploy deployment/mysql # 查看变更进度
#label 操作
kubectl label:添加label值 kubectl label nodes node1 zone=north #增加节点lable值 spec.nodeSelector: zone: north #指定pod在哪个节点
kubectl label pod redis-master-1033017107-q47hh role=master #增加lable值 [key]=[value]
kubectl label pod redis-master-1033017107-q47hh role- #删除lable值
kubectl label pod redis-master-1033017107-q47hh role=backend --overwrite #修改lable值
# 滚动升级
kubectl rolling-update:滚动升级 kubectl rolling-update redis-master -f redis-master-controller-v2.yaml #配置文件滚动升级
kubectl rolling-update redis-master --image=redis-master:2.0 #命令升级
kubectl rolling-update redis-master --image=redis-master:1.0 --rollback #pod版本回滚
# etcdctl 常用操作
etcdctl cluster-health #检查网络集群健康状态
etcdctl --endpoints=https://192.168.71.221:2379 cluster-health #带有安全认证检查网络集群健康状态
etcdctl member list
etcdctl set /k8s/network/config ‘{ “Network”: “10.1.0.0/16” }’
etcdctl get /k8s/network/config
# 删除
kubectl delete pod -l app=flannel -n kube-system # 根据label删除:
kubectl delete -f ./pod.json # 删除 pod.json 文件中定义的类型和名称的 pod
kubectl delete pod,service baz foo # 删除名为“baz”的 pod 和名为“foo”的 service
kubectl delete pods,services -l name=myLabel # 删除具有 name=myLabel 标签的 pod 和 serivce
kubectl delete pods,services -l name=myLabel --include-uninitialized # 删除具有 name=myLabel 标签的 pod 和 service,包括尚未初始化的
kubectl -n my-ns delete po,svc --all # 删除 my-ns namespace下的所有 pod 和 serivce,包括尚未初始化的
kubectl delete pods prometheus-7fcfcb9f89-qkkf7 --grace-period=0 --force 强制删除
kubectl delete deployment kubernetes-dashboard --namespace=kube-system
kubectl delete svc kubernetes-dashboard --namespace=kube-system
kubectl delete -f kubernetes-dashboard.yaml
kubectl replace --force -f ./pod.json # 强制替换,删除后重新创建资源。会导致服务中断。
# 交互
kubectl logs nginx-pod # dump 输出 pod 的日志(stdout)
kubectl logs nginx-pod -c my-container # dump 输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用)
kubectl logs -f nginx-pod # 流式输出 pod 的日志(stdout)
kubectl logs -f nginx-pod -c my-container # 流式输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用)
kubectl run -i --tty busybox --image=busybox -- sh # 交互式 shell 的方式运行 pod
kubectl attach nginx-pod -i # 连接到运行中的容器
kubectl port-forward nginx-pod 5000:6000 # 转发 pod 中的 6000 端口到本地的 5000 端口
kubectl exec nginx-pod -- ls / # 在已存在的容器中执行命令(只有一个容器的情况下)
kubectl exec nginx-pod -c my-container -- ls / # 在已存在的容器中执行命令(pod 中有多个容器的情况下)
kubectl top pod POD_NAME --containers # 显示指定 pod和容器的指标度量
kubectl exec -ti podName /bin/bash # 进入pod
# 调度配置
kubectl cordon k8s-node # 标记 my-node 不可调度
kubectl drain k8s-node # 清空 my-node 以待维护
kubectl uncordon k8s-node # 标记 my-node 可调度
kubectl top node k8s-node # 显示 my-node 的指标度量
kubectl cluster-info dump # 将当前集群状态输出到 stdout
kubectl cluster-info dump --output-directory=/path/to/cluster-state # 将当前集群状态输出到 /path/to/cluster-state
#如果该键和影响的污点(taint)已存在,则使用指定的值替换
kubectl taint nodes foo dedicated=special-user:NoSchedule
#查看kubelet进程启动参数
ps -ef | grep kubelet
# 查看日志:
journalctl -u kubelet -f
导出配置文件:
导出proxy
kubectl get ds -n kube-system -l k8s-app=kube-proxy -o yaml>kube-proxy-ds.yaml
导出kube-dns
kubectl get deployment -n kube-system -l k8s-app=kube-dns -o yaml >kube-dns-dp.yaml
kubectl get services -n kube-system -l k8s-app=kube-dns -o yaml >kube-dns-services.yaml
导出所有 configmap
kubectl get configmap -n kube-system -o wide -o yaml > configmap.yaml
复杂操作命令:
删除kube-system 下Evicted状态的所有pod:
kubectl get pods -n kube-system |grep Evicted| awk ‘{print $1}’|xargs kubectl delete pod -n kube-system
以下为维护环境相关命令:
重启kubelet服务
systemctl daemon-reload
systemctl restart kubelet
k8s是一个集群,他将每个微服务应用打包成一个docker镜像,然后丢到k8s容器里面,每个镜像就是一个节点了,至于会丢到哪台机器,k8s会根据集群中机器资源的使用状况来定。至于部署好之后,我只需要知道一台机器的ip+登录信息,就可以获取到整个集群的所有节点的信息了斜体样式
mysql -h 10.4.0.44 -u root -psawXG841rx
kubectl logs gasc-community-access-68589d76-wk6pj -n gasc-test |tail -n 1
kubectl get pod -n gasc-dev
kubectl logs gasc-base-government-7c87c4ff88-qdw2d -n gasc-dev|grep "/file/add" -A20 -B20
kubectl describe pod -n gasc-dev unified-file-service-855cb9cc8b-j2xvm
cat ibpms_engine_api.log|grep 20:41:15 -A40 -B70
cd gasc-base-government/
cat gasc-base-government.log | tail -n 500
cat gasc-base-government.log | grep "/file/add" -A20 -B20
history查询历史命令
kubectl apply -f ingress.yaml
vim ingress.yaml
history | grep mysql
history | grep mysql
curl -I htps://ctrain-live.tgovcloud.com
curl -I htps://ctrain-live.tgovcloud.com
kubectl get svn -n gasc-dev
直接运行curl实现错误再现
curl --location --request POST 'http://ipcgasc.pdcts.com.cn/api/reservation/config/get' --header 'A
uthorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJhY2NvdW50IjoiMTExMTExMTEiLCJ0cyI6MTU5NTc3MzQ1NTkxOCwiYWNjb3VudFR5cGUiOjF9.KfKpydI
6-vakDm78CPR8wnHnJAC1Jo_QipICe07y2P0' --header 'x-gasc-utype: {{x-gasc-utype}}' --header 'x-gasc-uid: eason' --header 'Content
-Type: application/json' --data-raw '{
"hallId": 732282014736056320,
"itemId": 729758094745141249
}'
//grep参数详解
//-A 20 除了显示符合范本样式的那一行之外,并显示该行之后的20行的内容。
//-A 20 除了显示符合范本样式的那一行之外,并显示该行之前的20行的内容。
kubectl logs xxx -n gasc-dev|grep "doc/import" -A 20 -B 20
kubectl exec -it gasc-base-government-686d9fcd44-j869z /bin/bash -n gasc-dev
kubectl exec -it /bin/bash gasc-base-government-686d9fcd44-j869z -n gasc-dev
kubectl get pod -n gasc-dev -o wide
history|grep kube
kubectl delete deployment engine-api -n gasc-test
kubectl logs engine-api-678fbcb7df-zrwcl -n gasc-test
kubectl get pod -n gasc-test -o wide
查看发布状态
kubectl get pod -n gasc-dev
kubectl get pod -n gasc-dev -o wide
查看容器日志
kubectl logs -f gasc-base-government-686d9fcd44-j869z -n gasc-dev
查看k8s里面所有的pod【豌豆荚】
kubectl get pod -A
一个k8s容器里面有很多pod,一个pod里面有很多容器。
列出所有包含gasc-dev容器的pod【查看发布状态】
kubectl get pod -n gasc-dev
密码:
https://www.cnblogs.com/klvchen/archive/2018/09/04/9585746.html
还可以
参数详解
https://www.jianshu.com/p/b809f2aa3c0e
一,kubectl 命令行的语法如下:
$ kubectl [command] [TYPE] [NAME] [flags]
上面的命令是: kubectl命令行中,指定执行什么操作(command),指定什么类型资源对象(type),指定此类型的资源对象名称(name),指定可选参数(flags),后面的参数就是为了修饰那个唯一的对象
属于典型的英文语法,比如你是老师,你说,小明(kubectl)买(command)方便面(type)老坛酸菜方便面(name)桶装的(flag)。命令的根本原则是准确性,不能有异议!
https://www.cnblogs.com/chaojiyingxiong/p/11331545.html
查询所有pod并递归输出每个pod里面的容器镜像名称
kubectl get pods --all-namespaces -o jsonpath="{..image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c
自己撰写helm的chart(镜像)
【自己撰写helm的chart(镜像)】https://blog.csdn.net/rookie23rook/article/details/114843084
更多推荐
所有评论(0)