Kubernetes POD控制器
Kubernetes POD控制器
POD相关命令
kubectl选项
-n:指定名称空间
-o wide:查看详细信息
--image:指定镜像
-f:指定文件
-l:指定标签
--show-labels:查看标签
kubectl动作
get:查询
label:标签操作
create:创建
apply:创建pod
describe:查看详细信息
delete:删除
logs:查看日志
kubectl
# 1.查看所有的node,所有节点
[root@db01 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
db01 Ready master 30h v1.19.3
db02 Ready node 30h v1.19.3
db03 Ready node 30h v1.19.3
## 输出所有节点的详细信息
[root@db01 ~]$ kubectl -n kube-system get nodes -o wide
## 持续关注容器变化
[root@db01 ~]$ kubectl get pods -w
# 2.给node打标签
kubectl label nodes <node名> node-role.kubernetes.io/node=
[root@db01 ~]$ kubectl label nodes db02 test_node=test
[root@db01 ~]$ kubectl label nodes db03 test_node=test
# 3.查看所有pod,默认是default名称空间
[root@db01 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-v1-5b6b969d55-t9rwc 1/1 Running 0 8h
nginx-wj 1/1 Running 0 8h
# 4.指定名称空间查看pod
[root@db01 ~]$ kubectl -n kube-system get pods
## 输出所有pod的详细信息
[root@db01 ~]$ kubectl -n kube-system get pods -o wide
# 查看pod内容器日志
kubectl logs -f pod名称 容器名称
-f:持续关注
POD沉浸式体验
创建pod两种方式
- 清单,yaml文件
# 清单,yaml文件,一个pod创建单个容器
[root@db01 ~]$ vim nginx_pod.yml
apiVersion: v1 # 控制器版本号,pod的版本号就是v1
kind: Pod # 资源类型,控制器 controller
metadata: # 元数据
name: nginx-wj # POD名称
labels: # 标签
app: nginx-v1 # app: nginx-v1 标签名(app=key,nginx-v1=value)
spec: # 容器详细信息
containers: # 第一个容器
- image: nginx:alpine # 容器的基础镜像
imagePullPolicy: IfNotPresent # 镜像拉取规则,always(默认)
name: nginx # 容器名字
# 一个Pod创建多个容器
[root@db01 ~]$ vim nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-v3
labels:
app: nginx-v3-label
name: wj
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx-v3-image
- image: redis
imagePullPolicy: IfNotPresent
name: redis-v1-image
## 查找容器创建到了哪个节点
[root@db01 ~]$ kubectl describe pods nginx-v3
Name: nginx-v3 # //pod名称
Namespace: default # //名称空间
Priority: 0
Node: db02/10.0.0.52 # //所在节点
Start Time: Wed, 24 Nov 2021 21:12:28 +0800 # //启动时间
Labels: app=nginx-v3-label # //pod标签
name=wj
## 创建容器
kubectl create -f 指定清单文件名称
### 推荐
kubectl apply -f 指定清单文件名称
## 镜像拉取规则
IfNotPresent:如果镜像在宿主机上不存在则拉取
always:不管镜像是否存在都拉取,每次创建 Pod 都会重新拉取一次镜像
Never:Pod 永远不会主动拉取这个镜像
清单文件帮助
K8S官方:https://kubernetes.io/docs/reference/config-api/apiserver-audit.v1/
黑科技:https://k8s.mybatis.io/v1.19/
- 命令行
# 命令行
[root@db01 ~]$ kubectl create deployment nginx-v1 --image=nginx:alpine
[root@db01 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-v2-68ffd88694-xhmrl 1/1 Running 0 23s
## deployment:控制器,加上后该pod无法被直接删除
# 删除deployment创建的pod
kubectl delete deployments.apps pod名称
# 查看pod创建流程详细信息
[root@db01 ~]$ kubectl describe pods nginx-v2-68ffd88694-xhmrl
# 进入pod
kubectl exec -it pod名称 (/bin/sh | /bin/bash)
[root@db01 ~]$ kubectl exec -it nginx-v2-68ffd88694-xhmrl /bin/sh
## 进入容器
kubectl exec -it pod名称 -c 容器名称 (/bin/sh | /bin/bash)
### 未来版本使用
[root@db01 ~]$ kubectl exec -it nginx-v2-68ffd88694-xhmrl -- /bin/sh
# 删除pod
[root@db01 ~]$ kubectl delete pods nginx-v2-68ffd88694-xhmrl
# 删除所有pod
[root@db01 ~]$ kubectl delete pods --all
# 删除deployment创建的pod
kubectl delete deployments.apps pod名称
## 容器名字的组成
k8s_nginx_nginx-wj_default_3e8b6d92-68a3-447a-a5a3-f745d5545944_0
k8s前缀_容器名_POD名_名称空间_随机值_0后缀
# 创建名称空间
kubectl create namespace 指定名称空间的名字
[root@db01 ~]$ kubectl create namespace nginx-php
# 查看名称空间
[root@db01 ~]$ kubectl get namespaces
NAME STATUS AGE
default Active 8d
kube-node-lease Active 8d
kube-public Active 8d
kube-system Active 8d
nginx-php Active 9s
# 删除名称空间
[root@db01 ~]$ kubectl delete namespaces nginx-php
标签设置
###################################################### node ######################################################
# 1.查看node标签
[root@db01 ~]$ kubectl get nodes --show-labels
# 2.给node打标签
[root@db01 ~]$ kubectl label nodes db02 CPU=Xeon
[root@db01 ~]$ kubectl label nodes db03 Disk=Flash
# 3.根据指定标签查找node
[root@db01 ~]$ kubectl get nodes --show-labels -l CPU=Xeon
[root@db01 ~]$ kubectl get nodes --show-labels -l test_node
NAME STATUS ROLES AGE VERSION LABELS
db02 Ready node 31h v1.19.3 node-role.kubernetes.io/node=,test_node=test
# 4.删除标签
[root@db01 ~]$ kubectl label nodes db02 CPU-
## 语法:
### 增
kubectl label <操作对象nodes|pods> <对应对象名> 标签名=标签值
### 减
kubectl label <操作对象nodes|pods> <对应对象名> 标签名-
## 清单中指定node标签
### 首先需要给node节点一个标签
[root@db01 ~]$ kubectl label nodes db02 Disk=Flash
### 清单文件中即可通过指定node标签,来创建pod到指定node
[root@db01 ~]$ vim nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-v3
labels:
app: nginx-v3-pod-label # //指定pod标签
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx-v3-image # //指定容器名称
nodeSelector: # //调度方式:nodeSelector,用此清单文件创建pod只会往指定的node标签所属node节点创建
Disk: Flash # //指定要创建pod到哪个node标签(Disk=key,Flash=value)
###################################################### POD ######################################################
# 1.查看pod标签
[root@db01 ~]$ kubectl get pods --show-labels
# 2.给pod打标签
[root@db01 ~]$ kubectl label pods nginx-wj test=label
[root@db01 ~]$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-wj 1/1 Running 0 9h app=nginx-v1,test=label
# 3.删除pod标签
[root@db01 ~]$ kubectl label pods nginx-wj test-
[root@db01 ~]$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-wj 1/1 Running 0 9h app=nginx-v1
# 4.查找指定标签的pods
[root@db01 ~]$ kubectl get pod --show-labels -l app=nginx-v1
NAME READY STATUS RESTARTS AGE LABELS
nginx-v1-5b6b969d55-4xkpb 1/1 Running 0 27m app=nginx-v1,pod-template-hash=5b6b969d55
nginx-wj 1/1 Running 0 9h app=nginx-v1
## 在清单中打标签
[root@db01 ~]$ vim nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-v3
labels:
app: nginx-v3-label # //给pod指定了俩标签
name: wj
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx-v3-image
[root@db01 ~]$ kubectl create -f nginx_pod.yaml
[root@db01 ~]$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-v1-5b6b969d55-4xkpb 1/1 Running 0 47m app=nginx-v1,pod-template-hash=5b6b969d55
nginx-v2-68ffd88694-4lsmg 1/1 Running 0 48m app=nginx-v2,pod-template-hash=68ffd88694
nginx-v3 1/1 Running 0 66s app=nginx-v3-label,name=wj
nginx-wj 1/1 Running 0 9h app=nginx-v1
# 根据指定标签查找pod
[root@db01 ~]$ kubectl get pod --show-labels -l name
NAME READY STATUS RESTARTS AGE LABELS
nginx-v3 1/1 Running 0 110s app=nginx-v3-label,name=wj
## 删除pod
[root@db01 ~]$ kubectl delete pods nginx-v2
## 根据标签删除
[root@db01 ~]$ kubectl delete pods -l name
[root@db01 ~]$ kubectl delete pods -l name=wj
[root@db01 ~]$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-v1-5b6b969d55-4xkpb 1/1 Running 0 51m app=nginx-v1,pod-template-hash=5b6b969d55
nginx-v2-68ffd88694-75j6m 1/1 Running 0 95s app=nginx-v2,pod-template-hash=68ffd88694
nginx-wj 1/1 Running 0 10h app=nginx-v1
重新认识pod
共享网络
POD内的容器使用Container模式共享根容器的网络
容器看到的网络设备信息和根容器完全相同
POD内的多个容器可以使用localhost进行网络通讯
POD内的多个容器不能绑定相同的端口
POD的生命周期和根容器一样,如果根容器退出了,POD就退出了
[root@db01 ~]$ vim nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: nginx-label
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx-web01
ports: ## //容器对外暴露的端口
- containerPort: 80
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx-web02
ports:
- containerPort: 8080
## ports:指定容器对外开放的端口,不是启动服务时的端口(此处两个nginx启动依然是80端口)
## 所以端口会冲突,第二个容器肯定无法启动
[root@db01 ~]$ kubectl apply -f nginx_pod.yaml
[root@db01 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-init 1/1 Running 0 6h31m
web 1/2 CrashLoopBackOff 3 77s
## 查看容器日志
[root@db01 ~]$ kubectl logs -f web nginx-web01
###################################################################################################################
# 起不同的容器
[root@db01 ~]$ vim nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: nginx-label
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx-web01
ports:
- containerPort: 80
- image: redis
imagePullPolicy: IfNotPresent
name: redis-v1
ports:
- containerPort: 6379
[root@db01 ~]$ kubectl apply -f nginx_pod.yaml
[root@db01 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 2/2 Running 0 101s 10.2.2.10 db02 <none> <none>
######################################### 连接进nginx容器
[root@db01 ~]$ kubectl exec -it web -c nginx-web01 /bin/sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 7E:4C:3C:2C:DD:D1
inet addr:10.2.2.10 Bcast:10.2.2.255 Mask:255.255.255.0 ## //查看容器ip
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
/ # echo 'test network' > /usr/share/nginx/html/index.html ## //添加测试信息到nginx页面
/ # curl 10.2.2.10 ## //能连接
test network
######################################### 连接redis容器
[root@db01 ~]$ kubectl exec -it web -c redis-v1 /bin/sh
root@web:/data# apt update ## //debian系统更新可用软件包列表
root@web:/data# apt install -y curl ## //安装curl命令
root@web:/data# curl 127.0.0.1 ## curl一下本机回环地址,依然能连接
test network
# 查看容器详细网络信息
## 进入宿主机节点查看
[root@db02 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
ce339618870a 40c68ed3a4d2 "docker-entrypoint.s…" 23 minutes ago
962b94180cab b46db85084b8 "/docker-entrypoint.…" 23 minutes ago
6ac035337b90 registry.aliyuncs.com/google_containers/pause:3.2 "/pause" 23 minutes ago
[root@db02 ~]$ docker inspect 962b94180cab|grep -i network
"NetworkMode": "container:6ac035337b90e2f35eac058a359b2137e5104815cca82e214808771dd132cc28",
"NetworkSettings": {
"Networks": {}
[root@db02 ~]$ docker inspect ce339618870a|grep -i network
"NetworkMode": "container:6ac035337b90e2f35eac058a359b2137e5104815cca82e214808771dd132cc28",
"NetworkSettings": {
"Networks": {}
### 两个容器 都是container模式 id与根容器相同,都连接了根容器
## 指定node节点
nodeName: node1
共享文件
默认情况下一个POD内的容器文件系统是互相隔离的
如果想让一个POD容器共享文件那么只需要定义一个Volume,然后两个容器分别挂载到这个Volume中
即:共享存储
## hostpath:被挂载的路径在宿主机存在,且一直存在
## emptyDir:被挂载的路径不在宿主机上,随即目录,容器关闭就会消失,临时的
举例
[root@db01 ~]$ vim nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
nodeName: db02 ## 指定该pod放到哪个节点开启
volumes: ## //宿主机被挂载点
- name: nginxlog ## //变量名
hostPath: ## //hostPath模式,宿主机存在被挂载的目录
path: /var/log/nginx ## //变量值,定义宿主机被挂载的路径(宿主机对端)
containers:
- name: nginx-1
image: nginx
volumeMounts: ## //容器挂载点
- name: nginxlog ## //挂载到该变量定义的路径
mountPath: /var/log/nginx ## //指定容器中要挂载的目录(容器本地)
- name: tail-log
image: busybox
## //让这个没有nginx服务的容器查看nginx日志,启动后查看到就表示挂载成功
args: [/bin/sh, -c, 'tail -f /var/log/nginx/access.log']
volumeMounts:
- name: nginxlog
mountPath: /var/log/nginx
[root@db01 ~]$ kubectl apply -f nginx_pod.yaml
## 测试
[root@db01 ~]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 2/2 Running 0 37s 10.2.2.11 db02 <none> <none>
[root@db01 ~]$ kubectl exec -it nginx -c nginx-1 -- /bin/sh # //进nginx容器插入信息到日志
/ # echo 123 > /var/log/nginx/access.log
/ # tail -1 /var/log/nginx/access.log
123
[root@db01 ~]$ kubectl exec -it nginx -c tail-log -- /bin/sh # //进入busybox容器查看nginx日志,能查看到
/ # tail -1 /var/log/nginx/access.log
123
[root@db02 ~]$ tail -1 /var/log/nginx/access.log # //宿主机查看,也能查到
123