常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| # 查看pod状态 kubectl get pods -o wide
# 查看部署任务状态 kubectl get deployment
# 查看服务状态 kubectl get svc
# 查看pod详情 kubectl describe pod
# 从yaml文件中创建 kubectl create -f <yaml file>
# 创建部署任务 kubectl create deployment <deployment name> --image=<image url>
# 删除部署任务 kubectl delete deployment <deployment name>
# 删除服务 kubectl delete svc <service name>
# 节点添加label kubectl label nodes --overwrite=true <node_name> <key>=<value>
# 节点删除label kubectl label nodes <node_name> <key>-
|
常见需求
操作:初始化worker节点
参考文档:
安装Kubernetes高可用
1. 与第一个master节点一起初始化
初始化第一个 master 节点时的输出内容中,第25、26行就是用来初始化 worker 节点的命令,如下:
1 2
| kubeadm join 6.6.6.100:8443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:ed82b9638ccefe499a252ed0e308b63478444ed2e4b78e203c1a511ff201d6d5
|
2. 第一个master节点初始化2h后
1 2 3 4 5 6
| # 在第一个master上执行,获取 join cmd # --ttl=0 表示生成的token永不过期 kubeadm token create --print-join-command --ttl=0
# worker节点执行 kubeadm join 6.6.6.100:8443 --token ddq7hm.yobrdrzynpb1or65 --discovery-token-ca-cert-hash sha256:ed82b9638ccefe499a252ed0e308b63478444ed2e4b78e203c1a511ff201d6d5
|
操作:指定pod调度节点
1. 单节点部署
单节点部署使用nodeName字段进行配置。在启动的json/yaml文件中,pod的spec结构下增加字段:"nodeName":"<nodename>"
。
2. 指定若干机器进行部署
1 2 3 4 5 6
| # 1. 管理node的标签 # 使用kubectl label nodes {nodename} {key=value} 进行标签的添加 kubectl label nodes 10.126.72.31 points=test
# 2. 使用nodeSelector选择器 # 类似于上文的nodeName,在创建资源的json/yaml文件中使用nodeSelector字段
|
操作:Kubectl 更新Secret内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 获取Secret中加密的文件的明文内容 kubectl get secret -n openstack {{ item.name }} -o yaml \ | grep '^ {{ item.config }}' \ | awk '{print $2}' \ | base64 -d > /tmp/{{ item.name }}_{{ item.config }}
# 更新文件内容 {% for x in replace_tls_secret_content_map %} sed -i 's|{{ x.regexp }}|{{ x.replace }}|g' /tmp/{{ item.name }}_{{ item.config }} {% endfor %}
# 文件内容加密,更新进Secret中 i=`base64 < /tmp/{{ item.name }}_{{ item.config }} | tr -d '\n'` kubectl get secret -n openstack {{ item.name }} -o json \ | jq --arg i $i '.data["{{ item.config }}"] = $i' \ | kubectl apply -f -
|
PS:代码片段取自 Ansible-playbook 中 task 的 shell 模块内容
操作:调度亲和与反亲和
策略名称 |
匹配目标 |
支持的操作符 |
支持拓扑域 |
设计目标 |
nodeAffinity |
主机标签 |
In,NotIn,Exists,DoesNotExist,Gt,Lt |
不支持 |
决定Pod可以部署在哪些主机上 |
podAffinity |
Pod标签 |
In,NotIn,Exists,DoesNotExist |
支持 |
决定Pod可以和哪些Pod部署在同一拓扑域 |
PodAntiAffinity |
Pod标签 |
In,NotIn,Exists,DoesNotExist |
支持 |
决定Pod不可以和哪些Pod部署在同一拓扑域 |
参考文档
Kubernetes调度之亲和性和反亲和性
Kubernetes中的亲和性与反亲和性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: replicas: 3 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: ... tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: k8s-app operator: In values: - kubernetes-dashboard
|
常见问题
问题 1:节点状态为SchedulingDisabled
1 2 3
| [root@k104 ~]# kubectl get node NAME STATUS ROLES AGE VERSION k104 Ready,SchedulingDisabled controlplane,etcd,master,worker 3d18h v1.21.4
|
解决办法
1 2 3 4 5 6 7 8
| [root@k104 ~]# kubectl cordon k104 node/k104 already cordoned [root@k104 ~]# kubectl uncordon k104 node/k104 uncordoned [root@k104 ~]# [root@k104 ~]# kubectl get node NAME STATUS ROLES AGE VERSION k104 Ready controlplane,etcd,master,worker 3d19h v1.21.4
|
常用工具
网络调试工具:busybox
编辑busybox.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox image: busybox:latest command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
|
启动这个pod
:kubectl create -f busybox.yaml
参考yaml配置
Nginx Deployment配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| apiVersion: apps/v1 kind: Deployment metadata: name: myweb spec: replicas: 1 selector: matchLabels: app: myweb template: metadata: labels: app: myweb spec: nodeSelector: type: node01 containers: - image: nginx:latest name: myweb imagePullPolicy: IfNotPresent ports: - containerPort: 80 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 60 timeoutSeconds: 20 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 60 timeoutSeconds: 20
|
Nginx Service配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: v1 kind: Service metadata: labels: app: myweb name: myweb spec: ipFamily: IPv6 ports: - port: 80 targetPort: 80 nodePort: 31111 selector: app: myweb type: NodePort
|
参考文档