当前位置: 代码网 > 服务器>服务器>云虚拟主机 > 静态pod 创建使用示例详解

静态pod 创建使用示例详解

2024年05月20日 云虚拟主机 我要评论
一.系统环境服务器版本docker软件版本kubernetes(k8s)集群版本cpu架构centos linux release 7.4.1708 (core)docker version 20.1

一.系统环境

服务器版本docker软件版本kubernetes(k8s)集群版本cpu架构
centos linux release 7.4.1708 (core)docker version 20.10.12v1.21.9x86_64

kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器操作系统版本cpu架构进程功能描述
k8scloude1/192.168.110.130centos linux release 7.4.1708 (core)x86_64docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calicok8s master节点
k8scloude2/192.168.110.129centos linux release 7.4.1708 (core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点
k8scloude3/192.168.110.128centos linux release 7.4.1708 (core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点

二.前言

本文介绍静态 pod,静态 pod 在指定的节点上由 kubelet 守护进程直接管理,不需要 api 服务器监管。

创建静态pod的前提是已经有一套可以正常运行的kubernetes集群,关于kubernetes(k8s)集群的安装部署,可以查看博客《centos7 安装部署kubernetes(k8s)集群》

三.静态pod

3.1 何为静态pod

静态 pod 在指定的节点上由 kubelet 守护进程直接管理,不需要 api 服务器监管。 与由控制面管理的 pod(例如,deployment) 不同;kubelet 监视每个静态 pod(在它失败之后重新启动)。静态 pod 始终都会绑定到特定节点的 kubelet 上

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

说明:如果你在运行一个 kubernetes 集群,并且在每个节点上都运行一个静态 pod, 就可能需要考虑使用 daemonset 替代这种方式。静态 pod 的 spec 不能引用其他 api 对象 (如:serviceaccount、 configmap、 secret 等)。

3.2 创建静态pod

静态pod的应用场景为:1.使master能正常启动 2.如果某天我们的master崩溃了,如何让别人知道我们的服务器在维护?
目前该命名空间是没有pod运行的

[root@k8scloude1 pod]# kubectl get pods
no resources found in pod namespace.

静态pod的创建方法为:写一个yaml文件,然后把yaml文件放在指定目录,会自动根据yaml文件创建pod。有两种方法来指定这个目录:

--pod-manifest-path

/etc/kubernetes/manifests

3.2.1 使用--pod-manifest-path指定静态pod目录

查看kubelet的配置文件位置,可以看到kubelet的配置文件在/usr/lib/systemd/system/kubelet.service

注意:我们是在k8s集群的worker节点k8scloude2上创建静态pod的

[root@k8scloude2 ~]# systemctl status kubelet
● kubelet.service - kubelet: the kubernetes node agent
   loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  drop-in: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   active: active (running) since 六 2022-01-15 12:27:34 cst; 5h 30min ago
     docs: https://kubernetes.io/docs/
 main pid: 947 (kubelet)
   memory: 122.6m
   cgroup: /system.slice/kubelet.service
           └─947 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infr...

修改kubelet的配置文件/usr/lib/systemd/system/kubelet.service,使用--pod-manifest-path=/etc/kubernetes/kubelet.d指定静态pod目录。

[root@k8scloude2 ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 
#--pod-manifest-path=/etc/kubernetes/kubelet.d表示静态pod的目录为/etc/kubernetes/kubelet.d
[root@k8scloude2 ~]# cat /usr/lib/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 --pod-manifest-path=/etc/kubernetes/kubelet.d"
environment="kubelet_config_args=--config=/var/lib/kubelet/config.yaml"
# this is a file that "kubeadm init" and "kubeadm join" generates 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/sysconfig/kubelet
execstart=
execstart=/usr/bin/kubelet $kubelet_kubeconfig_args $kubelet_config_args $kubelet_kubeadm_args $kubelet_extra_args

创建静态pod目录,并使kubelet配置文件生效

[root@k8scloude2 ~]# mkdir /etc/kubernetes/kubelet.d
[root@k8scloude2 ~]# systemctl daemon-reload 
[root@k8scloude2 ~]# systemctl restart kubelet
[root@k8scloude2 ~]# systemctl status kubelet
● kubelet.service - kubelet: the kubernetes node agent
   loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  drop-in: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   active: active (running) since 六 2022-01-15 18:02:15 cst; 6s ago
     docs: https://kubernetes.io/docs/
 main pid: 108844 (kubelet)
   memory: 30.7m
   cgroup: /system.slice/kubelet.service
           ├─108844 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/kubelet.d --config=/var/lib/ku...
           └─108999 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/kubelet.d --config=/var/lib/ku...

进入静态pod的目录,然后创建pod yaml文件

[root@k8scloude2 ~]# cd /etc/kubernetes/kubelet.d/
[root@k8scloude2 kubelet.d]# ls
[root@k8scloude2 kubelet.d]# vim pod.yaml
[root@k8scloude2 kubelet.d]# cat pod.yaml 
apiversion: v1
kind: pod
metadata:
  creationtimestamp: null
  labels:
    run: pod
  name: pod
spec:
  containers:
  - image: nginx
    imagepullpolicy: ifnotpresent
    name: pod
    resources: {}
    ports:
    - name: http
      containerport: 80
      protocol: tcp
  dnspolicy: clusterfirst
  restartpolicy: always
status: {}

在k8s集群的master节点上查看pod,在master上可以看到该pod,由于pod.yaml没有指定namespace,默认在default下,可以看到pod 名称(pod-k8scloude2)是以连字符开头的节点主机名作为后缀

[root@k8scloude1 pod]# kubectl get pods -n default -o wide
name             ready   status    restarts   age    ip               node         nominated node   readiness gates
pod-k8scloude2   1/1     running   0          109s   10.244.112.153   k8scloude2   <none>           <none>

当把这个pod.yaml文件从静态pod目录移走,pod就消失了

[root@k8scloude2 kubelet.d]# mv pod.yaml ~/
[root@k8scloude2 kubelet.d]# ls
#当把这个yaml文件移走,pod消失
[root@k8scloude1 pod]# kubectl get pods -n default -o wide
no resources found in default namespace.

现在指定静态pod的namespace为pod

[root@k8scloude2 kubelet.d]# vim pod.yaml 
#namespace: pod:指定pod的命名空间
[root@k8scloude2 kubelet.d]# cat pod.yaml 
apiversion: v1
kind: pod
metadata:
  creationtimestamp: null
  labels:
    run: pod
  name: pod
  namespace: pod
spec:
  containers:
  - image: nginx
    imagepullpolicy: ifnotpresent
    name: pod
    resources: {}
    ports:
    - name: http
      containerport: 80
      protocol: tcp
  dnspolicy: clusterfirst
  restartpolicy: always
status: {}
[root@k8scloude2 kubelet.d]# ls
pod.yaml

查看pod

[root@k8scloude1 pod]# kubectl get pods -n pod
name             ready   status    restarts   age
pod-k8scloude2   1/1     running   0          6s

3.2.2 静态pod默认目录/etc/kubernetes/manifests

注意:进行这一步的时候,先还原kubelet配置文件/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

查看配置文件,可以发现静态pod默认目录为/etc/kubernetes/manifests

[root@k8scloude2 kubelet.d]# cat /usr/lib/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" generates 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/sysconfig/kubelet
execstart=
execstart=/usr/bin/kubelet $kubelet_kubeconfig_args $kubelet_config_args $kubelet_kubeadm_args $kubelet_extra_args
[root@k8scloude2 kubelet.d]# ls /var/lib/kubelet/config.yaml
/var/lib/kubelet/config.yaml
[root@k8scloude2 kubelet.d]# cat /var/lib/kubelet/config.yaml | grep manifest
staticpodpath: /etc/kubernetes/manifests
#默认的静态pod的目录为 ls /etc/kubernetes/manifests
[root@k8scloude2 kubelet.d]# ls /etc/kubernetes/manifests

在默认的静态pod目录/etc/kubernetes/manifests/下创建pod yaml文件

#namespace: pod:指定pod的命名空间
[root@k8scloude2 kubelet.d]# vim ~/pod.yaml 
[root@k8scloude2 kubelet.d]# cat ~/pod.yaml 
apiversion: v1
kind: pod
metadata:
  creationtimestamp: null
  labels:
    run: pod
  name: pod
  namespace: pod
spec:
  containers:
  - image: nginx
    imagepullpolicy: ifnotpresent
    name: pod
    resources: {}
    ports:
    - name: http
      containerport: 80
      protocol: tcp
  dnspolicy: clusterfirst
  restartpolicy: always
status: {}
[root@k8scloude2 kubelet.d]# cp ~/pod.yaml /etc/kubernetes/manifests/

可以发现,静态pod已经创建了

[root@k8scloude1 pod]# kubectl get pods -n pod
name             ready   status    restarts   age
pod-k8scloude2   1/1     running   0          6s

删除yaml文件,静态pod消失

#删除yaml文件
[root@k8scloude2 kubelet.d]# rm -rf /etc/kubernetes/manifests/pod.yaml 
#pod消失
[root@k8scloude1 pod]# kubectl get pods -n pod
no resources found in pod namespace.

前面几步,静态pod是在k8s集群的worker节点上做的,现在在k8s集群的master节点上做。

注意:如果在/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf里添加了--pod-manifest-path=/etc/kubernetes/kubelet.d,则相应的/etc/kubernetes/manifests/下的yaml文件也要移动到/etc/kubernetes/kubelet.d目录下,不然k8s集群的master节点启动不起来。

可以看到k8s集群的master节点有很多静态pod。

[root@k8scloude1 pod]# ls /etc/kubernetes/manifests/
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml

以上就是静态pod 创建使用示例详解的详细内容,更多关于静态pod创建使用的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com