k8s:静态 Pod
静态 Pod
在Kubernetes集群中除了我们经常使用到的普通的 Pod 外,还有一种特殊的 Pod,叫做Static Pod,就是我们说的静态Pod。
静态 Pod 直接由特定节点上的kubelet进程来管理,不通过master 节点上的apiserver。无法与常用的控制器Deployment或者DaemonSet进行关联,它由kubelet进程自己来监控,当pod崩溃时重启该pod,kubelete也无法对他们进行健康检查。静态 pod 始终绑定在某一个kubelet,并且始终运行在同一个节点上。
kubelet会自动为每一个静态 pod 在 Kubernetes 的apiserver 上创建一个镜像 Pod(Mirror Pod),因此我们可以在 apiserver 中查询到该 pod,但是不能通过 apiserver 进行控制(例如不能删除)。
静态POD文档
创建静态 Pod 有两种方式:配置文件和 HTTP 两种方式
配置文件
配置文件就是放在特定目录下的标准的 JSON 或 YAML 格式的 pod 定义文件。用kubelet --pod-manifest-path=来启动kubelet进程,kubelet 定期的去扫描这个目录,根据这个目录下出现或消失的 YAML/JSON 文件来创建或删除静态 pod。
比如我们在 node01 这个节点上用静态 pod 的方式来启动一个 nginx 的服务。我们登录到node01节点上面,可以通过下面命令找到kubelet对应的启动配置文件路径
systemctl status -l kubelet
systemctl show --property=Environment kubelet| cat
配置文件有多个:
/etc/kubernetes/bootstrap-kubelet.conf
/etc/kubernetes/kubelet.conf
/var/lib/kubelet/config.yaml
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
其中,/var/lib/kubelet/config.yaml中我们可以看到相关的环境变量配置
如果我们通过kubeadm的方式来安装的集群环境,对应的kubelet已经配置了我们的静态 Pod 文件的路径,那就是/etc/kubernetes/manifests,所以我们只需要在该目录下面创建一个标准的 Pod 的 JSON 或者 YAML 文件即可:
[[email protected]-node01 ~]# cat >/etc/kubernetes/manifests/static-web.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
app: static
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
EOF
通过 HTTP 创建静态 Pods
kubelet 周期地从–manifest-url=参数指定的地址下载文件,并且把它翻译成 JSON/YAML 格式的 pod 定义。此后的操作方式与–pod-manifest-path=相同,kubelet 会不时地重新下载该文件,当文件变化时对应地终止或启动静态 pod。
静态pods的动作行为
kubelet 启动时,由–pod-manifest-path= or --manifesturl=参数指定的目录下定义的所有 pod 都会自动创建,例如,示例中的 static-web。(可能要花些时间拉取nginx 镜像,耐心等待…)
[[email protected] ~]# docker ps -a |grep web
b86fd5a6beb0 nginx "/docker-entrypoint.…" 25 seconds ago Up 23 seconds k8s_web_static-web-node1_default_2a903da59f950ee01df5cb98d25877e4_0
0aa5866f723a registry.aliyuncs.com/google_containers/pause:3.2 "/pause" 48 seconds ago Up 40 seconds k8s_POD_static-web-node1_default_2a903da59f950ee01df5cb98d25877e4_1
8bdc635b060c f6d0b4767a6c "/docker-entrypoint.…" 2 days ago Up 2 days k8s_web_test-79884b97bf-g42fr_abc_15f7a5b6-6949-4fc3-bc4a-b07b7e745baa_0
现在通过kubectl工具可以看到这里创建了一个新的镜像Pod:
[[email protected] ~]# kubectl get pods -o wide
static-web-node1 1/1 Running 0 4m13s 10.244.1.198 node1 <none> <none>
静态 pod 的标签会传递给镜像 Pod,可以用来过滤或筛选。需要注意的是,我们不能通过 API 服务器来删除静态pod(例如,通过kubectl命令),kebelet 不会删除它。
[[email protected] ~]# kubectl delete pods static-web-node1
pod "static-web-node1" deleted
[[email protected] ~]# kubectl get pods -o wide
static-web-node1 1/1 Running 0 28s 10.244.1.198 node1 <none> <none>
尝试手动终止容器,可以看到kubelet很快就会自动重启容器。
[[email protected] ~]# docker stop b86fd5a6beb0
b86fd5a6beb0
[[email protected] ~]# docker ps -a |grep web
16b62f381cc7 nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds k8s_web_static-web-node1_default_2a903da59f950ee01df5cb98d25877e4_1
b86fd5a6beb0 nginx "/docker-entrypoint.…" 7 minutes ago Exited (0) 24 seconds ago k8s_web_static-web-node1_default_2a903da59f950ee01df5cb98d25877e4_0
0aa5866f723a registry.aliyuncs.com/google_containers/pause:3.2 "/pause" 7 minutes ago Up 7 minutes k8s_POD_static-web-node1_default_2a903da59f950ee01df5cb98d25877e4_1
8bdc635b060c f6d0b4767a6c "/docker-entrypoint.…" 2 days ago Up 2 days k8s_web_test-79884b97bf-g42fr_abc_15f7a5b6-6949-4fc3-bc4a-b07b7e745baa_0
静态pods的动态增加和删除
运行中的kubelet周期扫描配置的目录(我们这个例子中就是/etc/kubernetes/manifests)下文件的变化,当这个目录中有文件出现或消失时创建或删除pods。
[[email protected] ~]# mv
/etc/kubernetes/manifests/static-web.yaml
/tmp
[[email protected] ~]# sleep 10
[[email protected] ~]# docker ps -a |grep web
// no nginx container is running
[[email protected] ~]# mv /tmp/static-web.yaml
/etc/kubernetes/manifests
[[email protected] ~]# sleep 10
[[email protected] ~]# docker ps -a |grep web
其实用 kubeadm 安装的集群,master 节点上面的几个重要组件都是用静态 Pod 的方式运行的,在 master 节点上查看/etc/kubernetes/manifests目录:
[[email protected] ~]# ls /etc/kubernetes/manifests/
etcd.yaml kube-apiserver.yaml kubecontroller-manager.yaml kube-scheduler.yaml
现在可以明白,这种方式也为我们将集群的一些组件容器化提供了可能,因为这些 Pod 都不会受到 apiserver 的控制,不然kube-apiserver怎么自己去控制自己?万一不小心把这个 Pod 删掉了呢?所以只能有kubelet自己来进行控制,这就是我们所说的静态 Pod。
下一篇: 基于Java代码实现支付充值的通用流程
推荐阅读
-
[!] Unable to find a pod with name, author, summary, or description matching
-
k8s:静态 Pod
-
k8s创建静态pod
-
pod install 报错(git: error: unable to read SDK settings)问题解决
-
k8s Service使用详解
-
K8s部署集群踩坑集锦
-
OS X10.11升级安装Cocoapods出现-bash: pod: command not found
-
离线安装 k8s 集群 kubeadmin方式
-
C++之POD数据类型
-
pod install abort完美解决方案