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

posted @ 2023-05-11 09:54  AnOldSong  阅读(45)  评论(0编辑  收藏  举报