首页 > 其他分享 >Kubernetes静态Pod

Kubernetes静态Pod

时间:2022-12-06 21:44:05浏览次数:74  
标签:web Kubernetes 静态 kubelet static node1 Pod

一、什么是Static Pod

静态 Pod 在指定的节点上由 kubelet 守护进程直接管理,不需要 API 服务器监管。 与由控制面管理的 Pod(例如,Deployment、RC、DaemonSet) 不同;kubelet 监视每个静态 Pod(在它崩溃之后重新启动)。

静态 Pod 永远都会绑定到一个指定节点上的 Kubelet。

kubelet 会尝试通过 Kubernetes API 服务器自动创建静态Pod。 这意味着节点上运行的静态 Pod 对 API 服务来说是可见的,但是不能通过 API 服务器来控制。 静态 Pod 名称将把以连字符开头的节点主机名作为后缀。

注意:如果你在运行一个 Kubernetes 集群,并且在每个节点上都运行一个静态 Pod, 就可能需要考虑使用 DaemonSet 替代这种方式;静态 Pod 的 spec 不能引用其他 API 对象 (如:ServiceAccount、 ConfigMap、 Secret 等);静态 Pod 不支持临时容器

最常见的 Static Pod:

  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler

二、创建 Static Pod

创建静态Pod的方式有两种:

  • 文件系统上的配置文件
  • Web 网络上的配置文件

2.1 文件系统上的静态 Pod 声明文件

首先需要时设定kubelet启动参数"--pod-manifest-path"或者在kubelet的配置文件中设定staticPodPath,指定的路径是kubelet监控的路径(如果k8s集群由kubeadm搭建,那默认存储在目录/etc/kubernetes/manifests下),kubelet 会定期的扫描该目录下的 YAML/JSON 文件来创建/删除静态 Pod。 

注意:声明文件是标准的 Pod 定义文件,以 JSON 或者 YAML 格式存储在指定目录;kubelet 扫描目录的时候会忽略以点开头的文件。

示例(centos7操作系统下,在k8s集群node1节点创建静态Pod):

1)、查看当前节点kubelet监控静态文件的路径

使用systemctl cat kubelet命令查看通过systemd配置的与kubelet有关的所有配置文件的路径与内容。

[root@node1 ~]# systemctl cat kubelet
# /etc/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=http://kubernetes.io/docs/

[Service]
ExecStart=/usr/local/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generate at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
Environment="KUBELET_EXTRA_ARGS=--node-ip=10.20.30.31 --hostname-override=node1 "
ExecStart=
ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

通过查看配置文件/var/lib/kubelet/config.yaml可以当前节点kubelet监控静态文件的路径为/etc/kubernetes/manifests。

[root@node1 ~]# cat /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s
cgroupDriver: cgroupfs
clusterDNS:
- 169.254.25.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionHard:
  memory.available: 5%
evictionMaxPodGracePeriod: 120
evictionPressureTransitionPeriod: 30s
evictionSoft:
  memory.available: 10%
evictionSoftGracePeriod:
  memory.available: 2m
featureGates:
  ExpandCSIVolumes: true
  RotateKubeletServerCertificate: true
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
kubeReserved:
  cpu: 200m
  memory: 250Mi
logging: {}
maxPods: 220
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
systemReserved:
  cpu: 200m
  memory: 250Mi
volumeStatsAggPeriod: 0s

2)、在当前节点kubelet监控静态文件的目录下创建static_pod.yaml文件,内容如下: 

# 在 kubelet 运行的节点上执行以下命令
cat <<EOF >/etc/kubernetes/manifests/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
EOF

3)、查看静态Pod

创建static_pod.yaml文件后,稍等片刻,便能够发现集群启动了一个Pod(如长时间未启动,查看docker服务服务引擎日志),通过kubectl客户端命令可以看到,静态 Pod 名称将把以连字符开头的节点主机名作为后缀。

[root@node1 manifests]# kubectl get pods
NAME               READY   STATUS    RESTARTS   AGE
static-web-node1   1/1     Running   0          2m2s

至此,成功通过文件系统上的静态 Pod 声明文件创建静态Pod。

2.2 Web 网上的静态 Pod 声明文件

Kubelet 根据 --manifest-url=<URL> 参数的配置定期的下载指定文件,并且转换成 JSON/YAML 格式的 Pod 定义文件。 与文件系统上的清单文件使用方式类似,kubelet 调度获取清单文件。 如果静态 Pod 的清单文件有改变,kubelet 会应用这些改变。

示例(centos7操作系统下,在k8s集群node1节点创建静态Pod): 1)、创建一个 YAML 文件,并保存在 web 服务上,为 kubelet 生成一个 URL。
apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP

2)、通过在选择的节点上使用 --manifest-url=<manifest-url> 配置运行 kubelet,修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf配置文件,增加--manifest-url配置项。

Environment="KUBELET_EXTRA_ARGS=--node-ip=10.20.30.31 --hostname-override=node1 --manifest-url=<manifest-url>"

3)、重启节点kubelet服务使配置生效

systemctl restart kubelet

稍等片刻,便能够发现集群启动了一个Pod。至此,成功通过Web 网上的静态 Pod 声明文件创建静态Pod。

三、修改Static Pod

直接修改当前节点kubelet监控静态文件的目录下Pod声明文件即可自动修改静态Pod配置。

示例:

1)、编辑当前节点kubelet监控静态文件的目录下Pod声明文件static-web.yaml,将容器云镜像地址改成nginx:34455。

[root@node1 manifests]# cat static-web.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
spec:
  containers:
    - name: web
      image: nginx:34455
      ports:
        - name: web
          containerPort: 80
          protocol: TCP

2)、修改static_pod.yaml文件后,稍等片刻,便能够发现修改的静态Pod重启了。

[root@node1 ~]# kubectl get pods
NAME               READY   STATUS         RESTARTS   AGE
static-web-node1   0/1     ErrImagePull   0          2m13s

通过查看Pod的详细内容,可以看到kubelet会在静态Pod崩溃之后重新启动启动他。

kubectl describe pod static-web-node1
......
......
Tolerations:        :NoExecute op=Exists
Events:
  Type     Reason   Age                  From     Message
  ----     ------   ----                 ----     -------
  Normal   Pulling  64s (x4 over 2m51s)  kubelet  Pulling image "nginx:34455"
  Warning  Failed   55s (x4 over 2m44s)  kubelet  Failed to pull image "nginx:34455": rpc error: code = Unknown desc = Error response from daemon: manifest for nginx:34455 not found: manifest unknown: manifest unknown
  Warning  Failed   55s (x4 over 2m44s)  kubelet  Error: ErrImagePull
  Warning  Failed   42s (x6 over 2m44s)  kubelet  Error: ImagePullBackOff
  Normal   BackOff  31s (x7 over 2m44s)  kubelet  Back-off pulling image "nginx:34455"

四、删除Static Pod

用 kubectl 从 API 服务上删除静态Pod static-web-node1 ,kubelet 不会移除静态 Pod:

[root@node1 ~]# kubectl delete pod static-web-node1 
pod "static-web-node1" deleted

可以看到 Pod 还在运行:

[root@node1 ~]# kubectl get pods
NAME               READY   STATUS             RESTARTS   AGE
static-web-node1   0/1     ImagePullBackOff   0          76s

在 kubelet 运行节点上手动停止容器。 可以看到过了一段时间后 kubelet 会发现容器停止了并且会自动重启 Pod:

# 在 kubelet 运行的节点上执行以下命令
# 把 ID 换为你的容器的 ID
[root@node1 ~]# docker ps |grep static-web-node1
a0a611424681   harbor.openserver.cn:443/cscec_big_data-cloudbases/pause:3.4.1              "/pause"                 13 minutes ago   Up 13 minutes                                                                 k8s_POD_static-web-node1_default_3c09375dc8dd5b2929407f92452b960b_0
[root@node1 ~]# docker stop a0a611424681
a0a611424681
[root@node1 ~]# docker ps |grep static-web-node1
3a174630e368   harbor.openserver.cn:443/cscec_big_data-cloudbases/pause:3.4.1              "/pause"                 2 seconds ago   Up 1 second                                                                   k8s_POD_static-web-node1_default_3c09375dc8dd5b2929407f92452b960b_1
[root@node1 ~]# 
删除该Pod的操作只能是到其所在Node上,将其自定义文件static-web.yaml从监控静态文件的目录下删除 。
[root@node1 manifests]# rm static-web.yaml 
rm: remove regular file ‘static-web.yaml’? y
[root@node1 manifests]# kubectl get pods
No resources found in default namespace.

稍等片刻,可以看到静态Pod被删除了。

 

参考:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/static-pod/

标签:web,Kubernetes,静态,kubelet,static,node1,Pod
From: https://www.cnblogs.com/zhangmingcheng/p/16954306.html

相关文章

  • Kubernetes(K8S) 监控 Prometheus + Grafana
    监控指标集群监控节点资源利用率节点数运行PodsPod监控容器指标应用程序Prometheus开源的监控、报警、数据库以HTTP协议周期性抓取被监控组件状态不需要......
  • kubernetes集群节点多网卡,calico/flannel组件如何指定网卡
    kubernetes集群节点多网卡,calico/flannel组件如何指定网卡1、calico如果有节点是多网卡,所以需要在deploy的env指定内网网卡  spec:containers:-env:-......
  • Kubernetes学习笔记(四十二):CKA已通过2022.12.04
    考试版本:1.25.2注意点:使用PSI内远程浏览器,可以多开tab,但不能导入书签,需要自己搜索,所以请熟悉完整命令和yaml格式考前请仔细阅读考试手册(预约考试页面有链接),特别是熟悉......
  • Linux Debian11使用Podman安装DVWA靶场环境
    一、DVWA靶场环境简介​1.DVWA一个用来进行安全脆弱性鉴定的PHP/MySQLWeb应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用......
  • Python如何使用类里面的静态方法?
    需求:Python如何使用类里面的静态方法?解决:@staticmethod#静态方法,是挂载在类下面的方法示例:classobj:def__init__(self,host):self.host=......
  • Kubernetes集群的Jenkins CI/CD版本上线流程部署
       最近在实习中接触了jenkins这个东西,所以花点时间了解了下。它可以在代码上传仓库(如github,gitee,gitlab)后,在jenkins(一个网站界面)中通过获取代码仓库中最新代码,进......
  • kubernetes CKA题库(附答案)
    第一题RBAC授权问题权重:4%设置配置环境:[student@node-1]$kubectlconfiguse-contextk8sContext为部署管道创建一个新的ClusterRole并将其绑定到范围为特定的name......
  • Kubernetes(K8S) helm chart
    感觉和放到一个yaml文件中,用----分隔,操作繁琐程度上,没有太大区别创建自定义Chart#创建自定义的chart名为mychart[root@k8smaster~]#helmcreatemychartCre......
  • Prominse的静态方法,Prominse.then的返回值,Prominse的三种状态,async函数,同源策略,get和p
    Prominse的静态方法有两种静态方法:all和race两种方法,all是返回全部的参数,race是返回最快的参数<script>functiontimeoutPro(delay){returnnewPromis......
  • Spring Boot注入静态变量
    SpringBoot注入静态变量@value或者@Autowired不能直接注入值给静态属性,spring不允许/不支持把值注入到静态变量中;spring支持set方法注入,我们可以利用非静态setter方法......