k8s —— pod、init 容器、及资源清单的使用
server1 :docker pull ikubernetes/myapp:v1docker pull ikubernetes/myapp:v2docker images | grep myapp | sed 's/ikubernetes/reg.westos.org\/library/g' | awk '{print "docker tag "$3" "$1":"$2}' | shdocker
·
k8s pod、init 容器、及资源清单的使用
pod
-
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
-
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
Pod生命周期
-
pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
-
Init 容器与普通的容器非常像,除了如下两点:
- 它们总是运行到完成。
- Init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。
-
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
init 容器
- Init 容器能做什么?
- Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
- Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
- 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
- Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
- 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
资源清单
-
格式如下:
-
apiVersion: group/version //指明api资源属于哪个群组和版本,同一个组可以有多个版本
-
$ kubectl api-versions //查询命令
-
-
kind: //标记创建的资源类型,k8s主要支持以下资源类别 Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
-
metadata: //元数据 name: //对像名称 namespace: //对象属于哪个命名空间 labels: //指定资源标签,标签是一种键值数据
-
spec: //定义目标资源的期望状态
查询帮助文档
- $ kubectl explain pod //查询帮助文档
实验
主机 | 版本 | 角色 |
---|---|---|
server1 | harbor v1.10.1 、 docker 20.10.6 | 私有仓库 |
server2 | k8s v1.21.2 、 docker 20.10.2 | master |
server3 | k8s v1.21.2 、 docker 20.10.2 | work node |
server4 | k8s v1.21.2 、 docker 20.10.2 | work node |
docker 镜像批量操作
server1 :
# docker 批量上传和删除镜像
docker pull ikubernetes/myapp:v1
docker pull ikubernetes/myapp:v2
# 批量改标签
docker images | grep myapp | sed 's/ikubernetes/reg.westos.org\/library/g' | awk '{print "docker tag "$3" "$1":"$2}' | sh
# 批量上传镜像
docker images | grep reg.westos.org/library/myapp | awk '{print "docker push "$1":"$2}' | sh
# 批量删除
docker images | grep reg.westos.org/library/myapp | awk '{print "docker rmi " $1":"$2}' | sh
docker images | grep reg.westos.org/library/myapp
k8s 常用命令
server2 :
# 运行一个 pod
kubectl run nginx --image=myapp:v1
# 查看pod ,默认namespace 是 default
kubectl get pod
# 查看 pod 详细信息
kubectl describe nginx
# 显示 pod 简略信息,包括 ip 及 所调度到主机
kubectl get pod -o wide
# 通过pod ip 访问pod
curl 10.244.1.2
# 查看 pod 日志
kubectl logs nginx
# 创建deployment 控制器,depolyment 控制器,确保一定数量的pod 在运行。
kubectl create deployment nginx --image=myapp:v1
kubectl get pod -o wide
# 手动设置控制器下 pod 副本。
kubectl scale deployment --replicas=2 nginx
kubectl get pod -o wide
# 设置控制器暴露端口
kubectl expose deployment nginx --port=80
# 查看 default namespace 的服务。
kubectl get svc
# 通过服务ip 访问控制器
curl 10.96.100.213
# 服务详细信息
kubectl describe svc nginx
# 修改服务网络工作模式为 NdeoPort,会根据调度到的主机,进行随机端口映射。
kubectl edit svc nginx
type: NodePort
# 通过主机ip加所映射的主机端口进行访问
kubectl get pod -o wide
curl 172.25.9.4:30145/hostname.html
# 手动升级
kubectl set image deployment nginx myapp=myapp:v2
# 查看历史版本
kubectl rollout history deployment nginx
# 手动回滚
kubectl rollout undo deployment nginx --to-revision=1
# 删除pod,deployment,svc
kubectl delete pod nginx
kubectl delete deployments.apps nginx
kubectl delete svc nginx
pod 资源清单
# 查询帮助,查询资源清单各字段的含义及用法
kubectl explain pod.apiVersion
kubectl explain pod.spec
# 编写资源清单
# 创建pod 资源清单
vim pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
# 根据资源清单推送
kubectl apply -f pod.yml
# 根据资源清单删除
kubectl delete -f pod.yml
init 容器
# 初始化容器资源清单
vim init.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
initContainers:
- name: init-container
image: busybox
command: ["/bin/sh", "-c", "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
# 推送
kubectl apply -f init.yml
# 查看
kubectl get pod
# 删除
kubectl delete -f init.yml
更多推荐
已为社区贡献3条内容
所有评论(0)