常用命令

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 values与spec.template.metadata.labels列表一致
- 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

启动这个podkubectl 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:
## Kubernetes v1.19 不支持Service同时配置IPv4/IPv6。
# 设置.spec.ipFamily为:
# IPv4:API 服务器将从 service-cluster-ip-range 中分配 ipv4 地址
# IPv6:API 服务器将从 service-cluster-ip-range 中分配 ipv6 地址
ipFamily: IPv6
ports:
- port: 80
targetPort: 80
nodePort: 31111
selector:
app: myweb
type: NodePort

参考文档