标签的设置及使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 kubectl get [资源] -n [名称空间] --show-labels [root@master01 ~]# kubectl get nodes --show-labels [root@master01 ~]# kubectl get pod -n kube-flannel --show-labels [root@master01 ~]# kubectl label node node01 MEM=16G node/node01 labeled [root@master01 ~]# kubectl get nodes --show-labels node-role 角色标签的接口 node-role.kubernetes.io 标识调角色标签的接口 =变成-号,就是删除角色标签 node- node= :表示给角色打的标签名叫node [root@master01 ~]# kubectl label node node01 node-role.kubernetes.io/node= [root@master01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 5d23h v1.19.3 node01 Ready node 5d23h v1.19.3 node02 Ready node 5d23h v1.19.3 node03 Ready node 5d23h v1.19.3
给pod打标签的方法: 如果不资源清单里面不写标签,起来的pod就没有标签,不会存在默认标签的说法,所以资源清单里面一定要写标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 方法一: 使用命令打标签:(一般很少用命令打标签,以后起pod是用资源清单的,所以在资源清单里面打标签比较常用) [root@master01 ~]# kubectl label pod kube-flannel-ds-4ncf5 run=flannel -n kube-flannel kube-flannel-ds-4ncf5:Pod名 run=flannel:标签名 kube-flannel:名称空间 方法二: [root@master01 kubernetes]# vim nginx-label.yml apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: default labels: run: nginx spec: containers: - name: nginx:alpine image: nginx:alpine imagePullPolicy: IfNotPresent 运行资源清单 [root@master01 kubernetes]# kubectl apply -f nginx-label.yml 查看 [root@master01 kubernetes]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod 1/1 Running 0 23s run=nginx
将pod起到指定的node上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 上面执行了命令给node01打MEM=16G的标签 [root@master01 ~]# kubectl label node node01 MEM=16G 将pod起在MEM=16的节点上 [root@master01 kubernetes]# vim nginx2-label.yml apiVersion: v1 kind: Pod metadata: name: nginx-pod-v2 namespace: default labels: run: nginx spec: containers: - name: nginx-container-v2 image: nginx:alpine imagePullPolicy: IfNotPresent nodeSelector: MEM: 16G nodeSelector: MEM: 16G [root@master01 kubernetes]# kubectl apply -f nginx2-label.yml pod/nginx-pod-v2 created [root@master01 kubernetes]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 17m nginx-pod-v2 1/1 Running 0 32s 查看起在node01上的 [root@master01 kubernetes]# kubectl get pod nginx-pod-v2 -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-pod-v2 1/1 Running 0 6m26s 10.2.1.4 node01
删除标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 1、先查看 [root@master01 kubernetes]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod 1/1 Running 0 31m run=nginx nginx-pod-v2 1/1 Running 0 14m run=nginx 2、#删除标签 kubectl label [资源] [资源名] [标签名/标签key]- [root@master01 kubernetes]# kubectl label pod nginx-pod-v2 run- [root@master01 kubernetes]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod 1/1 Running 0 32m run=nginx nginx-pod-v2 1/1 Running 0 15m <none> 3、查看哪些pod打了run=nginx的标签,打了这个标签的都会被列出来 [root@master01 kubernetes]# kubectl get pod -l run=nginx NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 35m 4、打了标签比较方便,可以根据标签去筛选,还可以根据标签去删除pod [root@master01 kubernetes]# kubectl delete pod -l run=nginx pod "nginx-pod" deleted 但是一个pod里面起2个容器怎么连 -c 永远只有3个引号 默认连第一个容器 -c指定容器名
连接到pod 容器可以使用命令连接进去,pod也可以使用命令连接进去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 [root@master01 kubernetes]# kubectl exec -it nginx-pod-v2 -- /bin/sh / bin etc --:相当于分隔符,--后面的所有都是命令 1、编写一个pod起2个容器的资源清单 [root@master01 kubernetes]# vim nginx-busybox.yml apiVersion: "v1" kind: "Pod" metadata: name: nginx-busybox namespace: default spec: containers: - name: busybox-container image: busybox imagePullPolicy: IfNotPresent command : ["/bin/sh" ,"-c" ,"tail -f /etc/hosts" ] - name: nginx-container image: nginx:alpine imagePullPolicy: IfNotPresent 2、运行pod,并查看pod是否起来,查看pod起在哪个机器 [root@master01 kubernetes]# kubectl apply -f nginx-busybox.yml pod/nginx-busybox created [root@master01 kubernetes]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-5f5d9d69c4-d8hvx 1/1 Running 0 19h nginx-busybox 2/2 Running 0 8s nginx-pod-v2 1/1 Running 0 43m [root@master01 kubernetes]# kubectl get pod nginx-busybox -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-busybox 2/2 Running 0 3m34s 10.2.2.5 node02 3、连接进入容器 [root@master01 kubernetes]# kubectl exec -it nginx-busybox -- /bin/sh / total 0 drwxr-xr-x 2 root root 17 May 18 2023 bin drwxr-xr-x 2 daemon daemon 6 May 18 2023 sbin 该目录没有站点目录,所以进去的busybox容器,所以默认连第一个容器 4、如果需要连接指定的容器,需要使用选项-c指定 [root@master01 kubernetes]# kubectl exec -it nginx-busybox -c nginx-container -- /bin/sh / total 8 -rw-r--r-- 1 root root 497 Aug 14 06:12 50x.html -rw-r--r-- 1 root root 615 Aug 14 06:12 index.html -c:连接到指定的容器名 作用:k8s只需要在master上操作,就可以连到需要连的容器
2、重新认识Pod
共享网络
1 2 3 4 5 1、Pod内的容器使用Container模式共享根容器的网络 2、容器看到的网络设备信息和根容器完全相同 3、Pod内的多个容器可以使用localhost进行网络通讯 4、Pod内的多个容器不能绑定相同的端口 5、Pod的生命周期和根容器一样,如果根容器退出,Pod就退出
3、共享文件系统
1、本地共享储存
第一种:hostPath 本地的映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 docker run \ --name mysql57 \ -p 3306:3306 \ -v /data/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123 \ -e MYSQL_DATABASE=wp_db \ -e MYSQL_USER=wp_user \ -e MYSQL_PASSWORD=123 \ --restart=always \ -d mysql:5.7.44 1、编写资源清单 [root@master01 kubernetes]# vim wp.yml apiVersion: "v1" kind: "Pod" metadata: name: mysql57-pod namespace: default labels: app: mysql57 run: mysql57 spec: volumes: - name: mysql-data hostPath: path: /data/mysql - name: test-data hostPath: path: /opt/test containers: - name: mysql57-container image: mysql:5.7.44 imagePullPolicy: IfNotPresent env : - name: MYSQL_ROOT_PASSWORD value: "123" - name: MYSQL_DATABASE value: "wp_db" - name: MYSQL_USER value: "wp_user" - name: MYSQL_PASSWORD value: "123" args: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumeMounts: - name: mysql-data mountPath: /var/lib/mysql --xxx一般用args 如果是一条完整的命令就用command 2、运行资源清单,并查看pod运行的node [root@master01 kubernetes]# kubectl apply -f mysql.yml [root@master01 kubernetes]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql57-pod 1/1 Running 0 3m42s 10.2.3.14 node03 3、到node03节点查看目录是否映射 [root@node03 ~]# ll /data/mysql/ -rw-r----- 1 polkitd input 56 Sep 19 18:29 auto.cnf 容器里面mysql用户的uid gid都是999,宿主机上uid为999的是polkitd,gid为999的是input,系统只认ID,不认字符串,字符串是给人看的,知道名字就更好区分 4、连接到容器里面检查 [root@master01 kubernetes]# kubectl exec -it pod/mysql57-pod -- /bin/sh sh-4.2# mysql -uroot -p123 mysql> show databases; mysql> select host,user from mysql.user; mysql> show create database wp_db; sh-4.2# mysql -uwp_user -p123
Value
Behavior
""
默认不需要创建,会自动创建
DirectoryOrCreate
目录必须存在,权限必须是755
Directory
目录必须存在
FileOrCreate
文件必须存在,权限必须是644
File
文件必须存在
Socket
挂载socket文件
CharDevice
挂载字符设备文件(键盘,鼠标,终端…)
BlockDevice
挂载快设备文件(磁盘,U盘,移动硬盘…)
第二种:emptyDir
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 1、编写资源清单 [root@master01 kubernetes]# vim wp.yml apiVersion: "v1" kind: "Pod" metadata: name: mysql57-pod namespace: default labels: app: mysql57 run: mysql57 spec: volumes: - name: mysql-data hostPath: path: /data/mysql - name: empty-data emptyDir: {} containers: - name: mysql57-container image: mysql:5.7.44 imagePullPolicy: IfNotPresent env : - name: MYSQL_ROOT_PASSWORD value: "123" - name: MYSQL_DATABASE value: "wp_db" - name: MYSQL_USER value: "wp_user" - name: MYSQL_PASSWORD value: "123" args: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumeMounts: - name: empty-data mountPath: /var/lib/mysql 2、删除node03的data目录 [root@node03 ~]# rm -rf /data/mysql/ 3、删除上一次实验起的pod,重新运行资源清单 [root@master01 kubernetes]# kubectl delete pod mysql57-pod [root@master01 kubernetes]# kubectl apply -f mysql.yml [root@master01 kubernetes]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE mysql57-pod 1/1 Running 0 59s 10.2.3.24 node03 4、查询映射的datam目录 [root@node03 ~]# docker inspect 1dd8436185b0 "Mounts" : [ { "Type" : "bind" , "Source" : "/var/lib/kubelet/pods/b3994de1-53ba-4ccf-b3b1-a7bdc8f1b08d/volumes/kubernetes.io~empty-dir/empty-data" , [root@node03 ~]# ll /var/lib/kubelet/pods/b3994de1-53ba-4ccf-b3b1-a7bdc8f1b08d/volumes/kubernetes.io~empty-dir/empty-data total 188484 -rw-r----- 1 polkitd input 56 Sep 19 20:05 auto.cnf emptyDir: {} 只是临时使用:随机的临时目录 容器删除,这个目录就会被删除,做不到持久化 作用:在同一个Pod里,2个容器之间的文件是互相隔离的,想让他们互通某个目录就可以使用到,让2个容器同时都挂载到这个目录,这样子这两个容器就找到共享这个目录
将一个POD内的两个容器共享目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 1、编写资源清单 apiVersion: "v1" kind: "Pod" metadata: name: c7-nginx namespace: default spec: volumes: - name: empty-data emptyDir: {} containers: - name: nginx-container image: nginx:alpine imagePullPolicy: IfNotPresent volumeMounts: - name: empty-data mountPath: /usr/share/nginx/html - name: c7-container image: centos:7 imagePullPolicy: IfNotPresent command : ["/bin/sh" ,"-c" ,"tail -f /etc/hosts" ] volumeMounts: - name: empty-data mountPath: /opt/html 2、运行资源清单,并查看pod运行的node [root@master01 kubernetes]# kubectl apply -f c7-busybox-emptyDir.yml pod/c7-nginx created [root@master01 kubernetes]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE c7-nginx 2/2 Running 0 5s 10.2.3.30 node03 3、测试2个容器是否共享了目录 [root@node03 ~]# docker inspect dbb9f576eacd "Mounts" : [ { "Type" : "bind" , "Source" : "/var/lib/kubelet/pods/bed3c777-7aff-4593-a7bc-f2bc3ed47827/volumes/kubernetes.io~empty-dir/empty-data" , "Destination" : "/opt/html" , "Mode" : "" , "RW" : true , "Propagation" : "rprivate" 4、查看挂载的随机目录,是空的 [root@node03 ~]# ll /var/lib/kubelet/pods/bed3c777-7aff-4593-a7bc-f2bc3ed47827/volumes/kubernetes.io~empty-dir/empty-data total 0 5、连进容器里面查看挂载目录,是空的 [root@master01 kubernetes]# kubectl exec -it c7-nginx -c nginx-container -- /bin/sh / [root@master01 ~]# kubectl exec -it c7-nginx -c c7-container -- /bin/bash [root@c7-nginx /]# ls -l /opt/html/ total 0 6、进入随机目录,并且创建一个文件 [root@node03 ~]# cd /var/lib/kubelet/pods/bed3c777-7aff-4593-a7bc-f2bc3ed47827/volumes/kubernetes.io~empty-dir/empty-data [root@node03 empty-data]# echo "test 将一个POD内的两个容器共享目录" > index.html 7、进入容器,查看文件可以看到2个容器都可以看到创建的文件内容 / test 将一个POD内的两个容器共享目录/ test 将一个POD内的两个容器共享目录[root@c7-nginx /]# cat /opt/html/index.html test 将一个POD内的两个容器共享目录[root@c7-nginx /]# curl 127.0.0.1 test 将一个POD内的两个容器共享目录一个pod起在node02,一个起在node03,只能用nfs共享 command 后面的命令会让容器把后面的命令当初PID为1的进程,那条命令结束,进程就结束了
1 2 3 4 5 6 7 8 比如说想改nginx端口,想用8080,用资源清单怎么改配置文件 pod不能自动拉取 pod初始化容器,想临时改里面某些东西,比如说添加www用户,统一用户 钩子 启动钩子:启动之前让他做一些事情 停止钩子:pod结束了就停止钩子,结束之前想让他发邮件告警 探针:k8s挂了可以重新拉起,那么pod没挂,但是网站是404或者50几,网站不能正常访问,但是k8s只检测pod有没有挂或者被删除,但是10个pod都是404,pod在,不会重新拉起,就要用探针 存活探针 救续探针 自动扩缩容
wordpress镜像
在一个POD里启动两个容器 wordpress和mysql5.7,用户上传数据的目录做持久化,该打标签的打标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 docker run \ --name mysql57 \ -p 3306:3306 \ -v /data/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123 \ -e MYSQL_DATABASE=wp_db \ -e MYSQL_USER=wp_user \ -e MYSQL_PASSWORD=123 \ --restart=always \ -d mysql:5.7.44 docker run \ --name wp \ --link mysql57 \ -p 80:80 \ -e WORDPRESS_DB_HOST=mysql57 \ -e WORDPRESS_DB_USER=wp_user \ -e WORDPRESS_DB_PASSWORD=123 \ -e WORDPRESS_DB_NAME=wp_db \ -d wordpress-df:v2 [root@master01 kubernetes]# vim wp.yml apiVersion: "v1" kind: "Namespace" metadata: name: wp --- apiVersion: v1 kind: Pod metadata: name: wp-pod namespace: wp spec: containers: - name: wp-containers image: wordpress-df:v2 imagePullPolicy: Never ports: - containerPort: 80 env : - name: WORDPRESS_DB_HOST value: "localhost" - name: WORDPRESS_DB_USER value: "wp_user" - name: WORDPRESS_DB_PASSWORD value: "123" - name: WORDPRESS_DB_NAME value: "wp_db" - name: mysql-containers image: mysql:5.7.44 imagePullPolicy: Never ports: - containerPort: 3306 env : - name: MYSQL_ROOT_PASSWORD value: "123" - name: MYSQL_DATABASE value: "wp_db" - name: MYSQL_USER value: "wp_user" - name: MYSQL_PASSWORD value: "123" volumeMounts: - name: db mountPath: /var/lib/mysql