主要记录最近遇到的一些开发问题,解决方法。
1. NodePort 服务仅指定 Node 可以访问
通过 NodePort 暴露的服务,在集群外可以使用 Kubernetes 任意 Node IP 加端口的形式访问。kube-proxy 会将访问流量以轮询的方式转发给 service 中的每个 Pod。
但是,发现并不是每一个 Node IP 加端口都可以访问,仅运行 Pod 的 Node 可以。
原因是,任意 Node IP 加端口访问,是通过主机间通信实现的。但是 docker 1.13 版本之后对 iptables 规则进行了改动,默认禁用了 FORWARD 。
查看 iptables 规则:
1
2
3
4
5
| iptables -L -n
...
Chain FORWARD (policy DROP)
...
|
打开全局 FORWARD :
1
| iptables -P FORWARD ACCEPT
|
2. 登陆 Kubernetes 中的容器终端
1
| kubectl exec -it {POD_NAME} -c {CONTAINER_NAME} -n {NAMESPACE_NAME} sh
|
如果 Pod 中只有一个 Container,则 -c {CONTAINER_NAME}
参数可以省略。
1
2
3
| kubectl get pod -n monitor
monitor prometheus-alertmanager-5bc4ccf9df-xmt7c 2/2 Running 6 3d23h
|
1
2
3
4
| kubectl log prometheus-alertmanager-5bc4ccf9df-xmt7c -n monitor
log is DEPRECATED and will be removed in a future version. Use logs instead.
Error from server (BadRequest): a container name must be specified for pod prometheus-alertmanager-5bc4ccf9df-xmt7c, choose one of: [prometheus-alertmanager prometheus-alertmanager-configmap-reload]
|
提示信息中,[prometheus-alertmanager prometheus-alertmanager-configmap-reload]
就是 Pod 中全部容器列表。
kubectl exec -it prometheus-alertmanager-5bc4ccf9df-xmt7c -c prometheus-alertmanager -n monitor sh
3. 批量删除 PVC
1
2
| kubectl get pvc -A | awk '{print $2}' |grep {KEYWORD} |xargs kubectl delete pvc -n
{NAME_SPACE}
|
4. 使用 StorageClass 提供 PV 动态存储
StorageClass 动态存储的特点是,管理员只需要创建存储服务、服务相关的 provisioner,而不用指定 PV 的大小。当用户使用存储时,只需要创建 PVC,Provisioner 会自动创建 PV 与之匹配。
在 CentOS 上搭建 NFS 服务,参考链接 。
安装 nfs-client-provisioner
1
| helm install --name nfs-client --set nfs.server=x.x.x.x --set nfs.path=/data stable/nfs-client-provisioner
|
1
2
| helm repo add stable https://charts.helm.sh/stable
helm install nfs-client stable/nfs-client-provisioner --set nfs.server=x.x.x.x --set nfs.path=/data
|
但 nfs-client-provisioner 已经停止维护,同时不支持高版本的 Kubernetes,推荐使用 csi-nfs 方案。
- 查看 StorageClass
1
2
3
| kubectl get sc
nfs-client cluster.local/nfs-client-nfs-client-provisioner 18s
|
- 指定 DefaultStorageClass
1
| kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
|
- 创建一个 PVC 测试
新建文件 pvc.yaml
1
2
3
4
5
6
7
8
9
10
| apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
|
执行命令:
1
| kubectl create -f pvc.yaml
|
查看 PVC:
1
2
3
4
| kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pvc-24e4dfc1-cb8b-444b-8e3c-36ec8350df3c 30Gi RWX nfs-client 2m
|
可以看到 pvc1 状态已经是 Bound,同时在 nfs 共享目录下发现,新文件夹 default-pvc1-pvc-24e4dfc1-cb8b-444b-8e3c-36ec8350df3c 。
5. 部署 csi-nfs
1
2
| helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version v4.9.0
|
1
2
3
4
5
6
7
8
9
10
11
12
| apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi-node1
provisioner: nfs.csi.k8s.io
parameters:
server: x.x.x.x
share: /data/nfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- nfsvers=4.1
|
1
2
3
4
5
6
7
8
9
10
11
| apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-csi-node1-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageClassName: nfs-csi-node1
|