开发 Tips(13)

2023年 1月 4日 37.4k 0

主要记录最近遇到的一些开发问题,解决方法。

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} 参数可以省略。

  • 获取 Pod 名称
1
2
3
kubectl get pod -n monitor

monitor       prometheus-alertmanager-5bc4ccf9df-xmt7c         2/2     Running   6          3d23h
  • 获取 Container 名称
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 中全部容器列表。

  • 登陆 Container 终端
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
    • helm2
    1
    
    helm install --name nfs-client --set nfs.server=192.168.13.20 --set nfs.path=/data stable/nfs-client-provisioner
    
    • helm3
    1
    2
    
    helm repo add stable https://charts.helm.sh/stable
    helm install nfs-client stable/nfs-client-provisioner --set nfs.server=192.168.13.20 --set nfs.path=/data
    
  • 查看 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 。

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论