创建静态 Pod
静态 Pod 永远都会绑定到一个指定节点上的 Kubelet一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。 。
kubelet 会尝试通过 Kubernetes API 服务器为每个静态 Pod 自动创建一个 。 这意味着节点上运行的静态 Pod 对 API 服务来说是不可见的,但是不能通过 API 服务器来控制。
要获知版本信息,请输入 .
This page assumes you’re using dockerDocker 是一种可以提供操作系统级别虚拟化(也称作容器)的软件技术。 to run Pods, and that your nodes are running the Fedora operating system. Instructions for other distributions or Kubernetes installations may vary. –>
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
要获知版本信息,请输入 kubectl version
.
本文假定你在使用 dockerDocker 是一种可以提供操作系统级别虚拟化(也称作容器)的软件技术。 来运行 Pod,并且你的节点是运行着 Fedora 操作系统。 其它发行版或者 Kubernetes 部署版本上操作方式可能不一样。
可以通过或者 web 网络上的配置文件来配置静态 Pod。
例如:下面是如何以静态 Pod 的方式启动一个简单 web 服务:
选择一个要运行静态 Pod 的节点。在这个例子中选择
my-node1
。
选择一个目录,比如在
/etc/kubelet.d
目录来保存 web 服务 Pod 的定义文件,/etc/kubelet.d/static-web.yaml
:# 在 kubelet 运行的节点上执行以下命令
mkdir /etc/kubelet.d/
cat <<EOF >/etc/kubelet.d/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
containerPort: 80
protocol: TCP
EOF
配置这个节点上的 kubelet,使用这个参数执行
--pod-manifest-path=/etc/kubelet.d/
:或者在 中添加
staticPodPath: <目录>
字段。
重启 kubelet。Fedora 上使用下面的命令:
# 在 kubelet 运行的节点上执行以下命令
systemctl restart kubelet
Web 网上的静态 Pod 声明文件
Kubelet 根据 --manifest-url=<URL>
参数的配置定期的下载指定文件,并且转换成 JSON/YAML 格式的 Pod 容器定义文件。 与使用方式类似,kubelet 调度获取声明文件。如果静态 Pod 的声明文件有改变,kubelet会应用这些改变。
按照下面的方式来:
创建一个 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
-
KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --manifest-url=<manifest-url>"
重启 kubelet。在 Fedora 上运行如下命令:
当 kubelet 启动时,会自动启动所有定义的静态 Pod。当定义了一个静态 Pod 并重新启动 kubelet 时,新的静态 Pod 就应该已经在运行了。
可以在节点上云心下面的命令来看运行的容器(包括静态 Pod):
docker ps
输出可能会像这样:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
可以在 API 服务上看到镜像 Pod:
kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web-my-node1 1/1 Running 0 2m
注意: 要确保 kubelet 在 API 服务上有创建镜像 Pod 的权限。如果没有,创建请求会被 API 服务拒绝。可以看Pod安全策略。
静态 Pod 上的 被传到镜像 Pod。 你可以通过 选择算符选择算符允许用户通过标签对一组资源对象进行筛选过滤。 使用这些标签,比如。
如果你用 kubectl
从 API 服务上删除镜像 Pod,kubelet 不会 移除静态 Pod:
kubectl delete pod static-web-my-node1
可以看到 Pod 还在运行:
kubectl get pods
NAME READY STATUS RESTARTS AGE
static-web-my-node1 1/1 Running 0 12s
# 在 kubelet 运行的节点上执行以下命令
docker stop f6d05272b57e # 把 ID 换为你的容器的 ID
sleep 20
docker ps
CONTAINER ID IMAGE COMMAND CREATED ...
5b920cbaf8b1 nginx:latest "nginx -g 'daemon of 2 seconds ago ...
运行的 kubelet 定期扫描配置的目录(比如例子中的 /etc/kubelet.d
目录)中的变化,并且根据文件中出现/消失的 Pod 来添加/删除 Pod。
# 前提是你在用主机文件系统上的静态 Pod 配置文件
# 在 kubelet 运行的节点上执行以下命令
#
mv /etc/kubelet.d/static-web.yaml /tmp
sleep 20
docker ps
# 可以看到没有 nginx 容器在运行
mv /tmp/static-web.yaml /etc/kubelet.d/
sleep 20