1 kubernetes的pod的分类

1.1 自主式pod

  • 自我管理的pod,创建以后仍然需要提交给apiserver,由apiserver接收以后借助于调度器将其调度至指定的node节点,由node启动此pod
  • 如果此pod出现故障,需要重启容器则由kubelet来完成
  • 如果node节点故障了,那么此pod将会消失。其无法实现全局调度。所以不推荐使用此种pod

1.2 控制器管理pod

常见的pod控制器

  • ReplicationController(副本控制器)
    当启动一个pod时,这个pod如果不够用可以再启一个副本,而后由控制器来管理同一类pod的各种副本与对象。一旦副本少了就会自动增加。采取多退少补的规则,精确符合我们所定义的期望

  • 支持滚动更新

  • ReplicaSet(复制集)
    由一个名叫Deployment的声明式更新的控制器来管理

  • Deployment(部署)
    Deployment只能管理无状态的应用

  • StateFulSet(状态集)
    有状态副本集,可以管理有状态的应用

  • DaemonSet(守护程序)

  • 如果需要在每个node上运行一个副本的时候可以用DaemonSet

  • job(任务)

  • Cronjob(定时任务)

  • 以上每种控制器都是用来实现一钟独特的应用管理的

2 k8s核心组件

2.1 HPA

  • Deployment还支持二级控制器
  • HPA(HorizontalPodAutoscaler,水平pod自动伸缩控制器)
  • 一般情况下我们可以确保一个node上有2个pod在运行,万一用户访问流量增加,2个pod不足以承载这么多访问量怎么办?此时我们就应该要增加pod资源,那么到底应该加几个?
  • HPA控制器可自动监控pod、自动进行扩展。

2.2 service

  • 假如有2个pod,pod有其生命周期,万一pod所在的节点宕机了,那么此pod将应该要在其他的节点上重建,而重建完的pod与原来的pod已经不是同一个pod了,只是两者都是运行的同一个服务而已。且每个容器都有其IP地址,重建的pod中的容器其IP地址与之前的pod中容器的IP地址是不一样的,如此一来就会存在一个问题,客户端如何访问这些pod中的容器呢?

  • 服务发现

  • pod是有生命周期的,一个pod随时都有可能离去,随时都有可能会有其他pod加进来,假如它们提供的是同一种服务,客户端是无法通过固定的手段来访问这些pod的,因为pod本身是不固定的,它们随时可能被替换掉,无论使用主机名还是P地址,都随时会被替换掉。

  • 为了尽可能的降低客户端与pod问协调的复杂度,k8s为每-组提供同类服务的pod和其客户端之间添加了一个中间层,这个中间层是固定的,这+中间层就叫service

  • service只要不被删除,其地址与名称皆是固定的,当客户端需要在其配置文件中写上访问某个服务时,它不再需要自动发现,只需要在配置文件中写明service的名称即可,而这个service是个调度器,其不但能够提供一个稳定的访问入口,还可以做反向代理,当service接收到客户端的请求后,会将其代理到后端的pod之上,一旦pod宕机了会立即新建一个pod,这个新建的pod会立即被service关联上,作为service后端的可用pod之一

  • 客户端程序访问服务都是通过IP+端口或者主机名+端口的方式来实现的。而service关联后端的pod不是靠它的IP和主机名,而是靠pod的标签选择器。只要创建的pod的label是统一的,无论IP地址和主机如何改变,其都能被service所识别。如此一来,只要pod属于标签选择器,只要其在service的管理范围之内,则其就会被关联到service中,当这个动态的pod关联到service中之后,再进行动态的探测此pod的IP地址、端口,再将其作为自己后端可调度的可用服务器主机对象。因此,客户端的请求发送到service,然后由service代理到后端真实的pod中的容器进行响应。

  • service不是一个程序,也不是一个组件,它只是一个iptables的dnat规则

  • service作为k8s的对象,有其自身的名称,而service的名称相当于服务的名称,而这个名称可以被解析
    addOns附件

  • dns pod

    • 装完k8s后第一件事就需要在k8s集群上部署一个dns pod,以确保各service的名称能够被解析

    • 可以动态改变,包括动态创建、动态删除、动态修改

    • 比如把service的名称改了,dnspod会自动触发,将dns解析记录中的名称也给改掉;假如我们手动把service的ip地址给改了,改完以后会自动触发,将dns服务中的解析记录给改掉。

    • 如此一来,客户端去访问pod资源的时候可以直接访问service的名称,然后由集群中专用的dns服务来负责解析。

  • 这种pod是k8s自身的服务就需要用到的pod,所以我们把它称为基础性的系统架构级的pod对象,而且它们也被称为集群附件

3 kubernetes网络模型

k8s对Pods之间如何进行组网通信提出了要求,k8s对集群的网络有以下要求

  • 所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信
  • 所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信
  • 每个Pod自己看到的自己的ip和其他Pod看到的一致

k8s网络模型设计基础原则:每个Pod都拥有一个独立的 IP地址,而且 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。 所以不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问。设计这个原则的原因 是,用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

由于 Kubemetes 的网络模型假设 Pod 之间访问时使用的是对方 Pod 的实际地址,所以一个
Pod 内部的应用程序看到的自己的 IP 地址和端口与集群内其他 Pod 看到的一样。它们都是 Pod 实际分配的IP地址 (从dockerO上分配的)。将IP地址和端口在Pod内部和外部都保持一致, 我们可以不使用 NAT 来进行转换,地址空间也自然是平的

鉴于上面这些要求,我们需要解决四个不同的网络问题

  • Docker容器和Docker容器之间的网络
  • Pod与Pod之间的网络
  • Pod与Service之间的网络
  • Internet与Service之间的网络

3.1 容器和容器之间的网络

在这里插入图片描述

  • 在k8s中每个Pod中管理着一组Docker容器,这些Docker容器共享同一个网络命名空间。
  • Pod中的每个Docker容器拥有与Pod相同的IP和port地址空间,并且由于他们在同一个网络命名空间,他们之间可以通过localhost相互访问。

什么机制让同一个Pod内的多个docker容器相互通信那?其实是使用Docker的一种网络模型:–net=container

container模式指定新创建的Docker容器和已经存在的一个容器共享一个网络命名空间,而不是和宿主机共享。新创建的Docker容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等

每个Pod容器有有一个pause容器其有独立的网络命名空间,在Pod内启动Docker容器时候使用 –net=container就可以让当前Docker容器加入到Pod容器拥有的网络命名空间(pause容器)

在这里插入图片描述

3.2 Pod与Pod之间的网络

在这里插入图片描述

  • k8s中,每个Pod拥有一个ip地址,不同的Pod之间可以直接使用改ip与彼此进行通讯
  • 在同一个Node上,从Pod的视角看,它存在于自己的网络命名空间中,并且需要与该Node上的其他网络命名空间上的Pod进行通信。

那么是如何做到的?这多亏了使用linux虚拟以太网设备或者说是由两个虚拟接口组成的veth对使不同的网络命名空间链接起来,这些虚拟接口分布在多个网络命名空间上(这里是指多个Pod上)

为了让多个Pod的网络命名空间链接起来,我们可以让veth对的一端链接到root网络命名空间(宿主机的),另一端链接到Pod的网络命名空间。

每对Veth就像一根接插电缆,连接两侧并允许流量在它们之间流动;这种veth对可以推广到同一个Node上任意多的Pod上,如上图这里展示使用veth对链接每个Pod到虚拟机的root网络命名空间。

在这里插入图片描述
如上图显示了两个Pod通过veth对链接到root网络命名空间,并且通过网桥进行通信

3.2.1 同一个Node中的Pod之间的一次通信

鉴于每个Pod有自己独立的网络命名空间,我们使用虚拟以太网设备把多个Pod的命名空间链接到了root命名空间,并且使用网桥让多个Pod之间进行通信,下面我们看如何在两个pod之间进行通信

在这里插入图片描述

  • 通过网桥这里把veth0和veth1组成为一个以太网,他们直接是可以直接通信的,另外这里通过veth对让pod1的eth0和veth0、pod2的eth0和veth1关联起来,从而让pod1和pod2相互通信。
  • Pod 1通过自己默认的以太网设备eth0发送一个数据包,eth0把数据传递给veth0,数据包到达网桥后,网桥通过转发表把数据传递给veth1,然后虚拟设备veth1直接把包传递给Pod2网络命名空间中的虚拟设备eth0.

3.2.2 不同Node中的Pod之间通信

k8s网络模型需要每个pod必须通过ip地址可以进行访问,每个pod的ip地址总是对网络中的其他pod可见,并且每个pod看待自己的ip与别的pod看待的是一样的(虽然他没规定如何实现),下面我们看不同Node间Pod如何交互

k8s中每个集群中的每个Node都会被分配了一个CIDR块(无类别域间路由选择,把网络前缀都相同的连续地址组成的地址组称为CIDR地址块)用来给该Node上的Pod分配IP地址。(保证pod的ip不会冲突)
另外还需要把pod的ip与所在的nodeip关联起来
在这里插入图片描述

  • 如上图Node1(vm1)上的Pod1与Node2(vm2)上Pod4之间进行交互
  • 首先pod1通过自己的以太网设备eth0把数据包发送到关联到root命名空间的veth0上,然后数据包被Node1上的网桥设备cbr0接受到,网桥查找转发表发现找不到pod4的Mac地址,则会把包转发到默认路由(root命名空间的eth0设备),然后数据包经过eth0就离开了Node1,被发送到网络。
  • 数据包到达Node2后,首先会被root命名空间的eth0设备,然后通过网桥cbr0把数据路由到虚拟设备veth1,最终数据表会被流转到与veth1配对的另外一端(pod4的eth0)

3.3 Pod与Service之间的网络

上面展示了Pod之间如何通过他们自己的ip地址进行通信,但是pod的ip地址是不持久的,当集群中pod的规模缩减或者pod故障或者node故障重启后,新的pod的ip就可能与之前的不一样的。所以k8s中衍生出来Service来解决这个问题。

k8s中 Service管理了一系列的Pods,每个Service有一个虚拟的ip,要访问service管理的Pod上的服务只需要访问你这个虚拟ip就可以了,这个虚拟ip是固定的,当service下的pod规模改变、故障重启、node重启时候,对使用service的用户来说是无感知的,因为他们使用的service的ip没有变。

当数据包到达Service虚拟ip后,数据包会被通过k8s给该servcie自动创建的负载均衡器路由到背后的pod容器

3.3.1 Pod到Service的一个包的流转

在这里插入图片描述

  • 如上图当从一个Pod发送数据包到Service时候,数据包先从Pod1所在的虚拟设备eth0离开pod1,并通过veth对的另外一端veth0传递给网桥cbr0,网桥找不到service对应ip的mac地址,所以把包转发给默认路由,也就是root命名空间的eth0
  • 在root命名空间的设备eth0接受到数据包前,数据包会经过iptables进行过滤,iptables接受数据包后会使用kube-proxy在Node上安装的规则来响应Service或Pod的事件,将数据包的目的地址从Service的IP重写为Service后端特定的Pod IP(本例子中是pod4).
  • 现在数据包的目的ip就不再是service的ip地址了,而是pod4的ip地址。
  • iptables利用Linux内核的conntrack来记住所做的Pod选择,以便将来的流量路由到同一个Pod(禁止任何扩展事件)。 从本质上讲,iptables直接在Node上进行了集群内负载均衡,然后流量使用我们已经检查过的Pod-to-Pod路由流到Pod。

3.3.2 Service到Pod的一个包的流转

在这里插入图片描述

  • 收到此数据包的Pod将会回发包到源Pod,回包的源IP识别为自己的IP(比如这里为Pod4的ip),将目标IP设置为最初发送数据包的Pod(这里为pod1的ip)。
  • 数据包进入目标Pod(这里为Pod1)所在节点后,数据包流经iptables,它使用conntrack记住它之前做出的选择,并将数据包的源IP重写为Service的IP。 从这里开始,数据包通过网桥流向与Pod1的命名空间配对的虚拟以太网设备,并流向我们之前看到的Pod1的以太网设备。

4 kubectl常用命令使用

4.1 kubectl用法概述

kubectl [command] [TYPE] [NAME] [flags]
  • command:子命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等
  • TYPE:资源对象的类型,区分大小写,能以单数形式、复数形式或者简写形式表示。例如以下3种TYPE是等价的
# kubectl get pod pod1
# kubectl get pods pod1
# kubectl get po pod1
  • NAME:资源对象的名称,区分大小写。如果不指定名称,则系统将返回属于TYPE的全部对象的列表,例如$ kubectl get pods将返回所有Pod的列表
  • flags:kubectl子命令的可选参数,例如使用“-s”指定apiserver的URL地址而不用默认值

4.2 Kubectl常用参数分类

在这里插入图片描述

4.3 kubectl常用命令演示

create命令

//创建一个deployment类型叫web的pod
[root@master ~]# kubectl create deployment web --image nginx
deployment.apps/web created

//创建一个deployment类型叫test的pod并执行sleep 300
[root@master ~]# kubectl create deployment test --image busybox -- sleep 300
deployment.apps/test created
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
test-59c48f4487-lb985   0/1     ContainerCreating   0          3s
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          2m52s

创建3个叫man的pod
[root@master ~]# kubectl create deployment man --image nginx --replicas 3
deployment.apps/man created
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          5s
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          5s
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          5s
test-59c48f4487-lb985   0/1     ContainerCreating   0          81s
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          4m10s

get 命令

// 查看所有namespace的pods运行情况
[root@master ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                         READY   STATUS                  RESTARTS   AGE
kube-system   coredns-7f89b7bc75-6p4z4                     1/1     Running                 0          16m
kube-system   coredns-7f89b7bc75-cvz52                     1/1     Running                 0          16m
kube-system   etcd-master.example.com                      1/1     Running                 0          17m
kube-system   kube-apiserver-master.example.com            1/1     Running                 0          17m
kube-system   kube-controller-manager-master.example.com   1/1     Running                 0          17m
kube-system   kube-flannel-ds-bccvv                        1/1     Running                 0          12m
kube-system   kube-flannel-ds-r4fq9                        1/1     Running                 0          12m
kube-system   kube-flannel-ds-zgxjs                        0/1     Init:ImagePullBackOff   0          12m
kube-system   kube-proxy-b7gdn                             1/1     Running                 0          12m
kube-system   kube-proxy-bsqsn                             1/1     Running                 0          16m
kube-system   kube-proxy-wjvpz                             1/1     Running                 0          12m
kube-system   kube-scheduler-master.example.com            1/1     Running                 0          17m

//查看pod列表
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          47s
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          47s
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          47s
test-59c48f4487-lb985   0/1     ContainerCreating   0          2m3s
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          4m52s

//查看指定类型的pod
[root@master ~]# kubectl get deployment man
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
man    0/3     3            0           2m43s

//显示pod节点的标签信息
[root@master ~]# kubectl get pod --show-labels
NAME                    READY   STATUS              RESTARTS   AGE     LABELS
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          4m29s   app=man,pod-template-hash=684d95cd56
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          4m29s   app=man,pod-template-hash=684d95cd56
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          4m29s   app=man,pod-template-hash=684d95cd56
test-59c48f4487-lb985   0/1     ContainerCreating   0          5m45s   app=test,pod-template-hash=59c48f4487
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          8m34s   app=web,pod-template-hash=96d5df5c8

//查看pod详细信息,也就是可以查看pod具体运行在哪个节点上(ip地址信息)
[root@master ~]# kubectl get pod -o wide
NAME                    READY   STATUS              RESTARTS   AGE     IP       NODE           NOMINATED NODE   READINESS GATES
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          6m46s   <none>   node2.example.com   <none>           <none>
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          6m46s   <none>   node2.example.com   <none>           <none>
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          6m46s   <none>   node2.example.com   <none>           <none>
test-59c48f4487-lb985   0/1     ContainerCreating   0          8m2s    <none>   node2.example.com   <none>           <none>
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          10m     <none>   node2.example.com   <none>           <none>

// 查看服务的详细信息,显示了服务名称,类型,集群ip,端口,时间等信息
[root@master ~]# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   31m

// 查看命名空间
[root@master ~]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   32m
kube-node-lease   Active   32m
kube-public       Active   32m
kube-system       Active   32m

// 查看目前所有的replica set,显示了所有的pod的副本数,以及他们的可用数量以及状态等信息
[root@master ~]# kubectl get rs
NAME              DESIRED   CURRENT   READY   AGE
man-684d95cd56    3         3         0       8m53s
test-59c48f4487   1         1         0       10m
web-96d5df5c8     1         1         0       12m

// 查看已经部署了的所有应用,可以看到容器,以及容器所用的镜像,标签等信息
[root@master ~]# kubectl get deploy -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES    SELECTOR
man    0/3     3            0           9m21s   nginx        nginx     app=man
test   0/1     1            0           10m     busybox      busybox   app=test
web    0/1     1            0           13m     nginx        nginx     app=web
[root@master ~]# kubectl get deployments -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES    SELECTOR
man    0/3     3            0           9m28s   nginx        nginx     app=man
test   0/1     1            0           10m     busybox      busybox   app=test
web    0/1     1            0           13m     nginx        nginx     app=web

run运行
在集群中创建并运行一个或多个容器镜像

运行一个nginx pod
[root@master ~]# kubectl run nginx --image nginx
pod/nginx created
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          16m
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          16m
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          16m
nginx                   0/1     ContainerCreating   0          9s
test-59c48f4487-lb985   0/1     ContainerCreating   0          17m
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          20m

//labels 指定标签,运行一个标签为"app=ng"的pod
[root@master ~]# kubectl run ng --image nginx --labels "app=ng"
pod/ng created
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          19m
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          19m
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          19m
ng                      0/1     ContainerCreating   0          5s
nginx                   0/1     ContainerCreating   0          3m36s
test-59c48f4487-lb985   0/1     ContainerCreating   0          21m
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          23m

试运行;打印相应的 API 对象而不创建它们
[root@master ~]# kubectl run httpd --image httpd --dry-run=client
pod/httpd created (dry run)
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          21m
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          21m
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          21m
ng                      0/1     ContainerCreating   0          2m6s
nginx                   0/1     ContainerCreating   0          5m37s
test-59c48f4487-lb985   0/1     ContainerCreating   0          23m
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          25m

// -it 交互模式,保持在前台,如果退出不要重启
[root@master ~]# kubectl run -it apache --image httpd --restart=Never
If you don't see a command prompt, try pressing enter.
/ # ls
bin   etc   proc  sys   usr
dev   home  root  tmp   var

delete删除资源

//单个删除
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
busybox                 0/1     ContainerCreating   0          2m41s
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          25m
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          25m
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          25m
ng                      0/1     ContainerCreating   0          6m9s
nginx                   0/1     ContainerCreating   0          9m40s
test-59c48f4487-lb985   0/1     ContainerCreating   0          27m
web-96d5df5c8-vm48h     0/1     ContainerCreating   0          29m
[root@master ~]# kubectl delete deployment web
deployment.apps "web" deleted

[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
busybox                 0/1     ContainerCreating   0          4m15s
man-684d95cd56-f6tk2    0/1     ContainerCreating   0          27m
man-684d95cd56-gx2lk    0/1     ContainerCreating   0          27m
man-684d95cd56-hwgxp    0/1     ContainerCreating   0          27m
ng                      0/1     ContainerCreating   0          7m43s
nginx                   0/1     ContainerCreating   0          11m
test-59c48f4487-lb985   0/1     ContainerCreating   0          28m

//删除具有相同名称myapp的 Pod 和服务
[root@master ~]# kubectl get pods,svc
NAME                        READY   STATUS              RESTARTS   AGE
pod/busybox                 0/1     ContainerCreating   0          7m7s
pod/man-684d95cd56-f6tk2    1/1     Running             0          30m
pod/man-684d95cd56-gx2lk    1/1     Running             0          30m
pod/man-684d95cd56-hwgxp    1/1     Running             0          30m
pod/ng                      0/1     ContainerCreating   0          10m
pod/nginx                   0/1     ContainerCreating   0          14m
pod/test-59c48f4487-lb985   1/1     Running             0          31m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   53m

[root@master ~]# kubectl delete deployment man
deployment.apps "man" deleted

[root@master ~]# kubectl get pods,svc
NAME                        READY   STATUS              RESTARTS   AGE
pod/busybox                 0/1     ContainerCreating   0          9m14s
pod/ng                      0/1     ContainerCreating   0          12m
pod/nginx                   1/1     Running             0          16m
pod/test-59c48f4487-lb985   1/1     Running             0          33m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   55m

//删除标签 app=nginx 的 Pod 和服务
[root@master ~]# kubectl  run web --image nginx --labels "app=nginx"
pod/web created
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
web    1/1     Running   0          20s
[root@master ~]# kubectl delete pod -l "app=nginx"
pod "web" deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.

//删除所有
[root@master ~]# kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
busybox                 0/1     ContainerCreating   0          10m
ng                      1/1     Running             0          13m
nginx                   1/1     Running             0          17m
test-59c48f4487-lb985   0/1     Completed           0          34m

[root@master ~]# kubectl delete pod --all
pod "busybox" deleted
pod "ng" deleted
pod "nginx" deleted
pod "test-59c48f4487-lb985" deleted

[root@master ~]# kubectl get pods
No resources found in default namespace

expose 端口映射
target-port 映射给那个容器端口
port 要映射的宿主机端口

//myapp的80映射到本机的8080
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myapp-6d8d776547-wx2l6   1/1     Running   0          11s
test-59c48f4487-h8p8q    1/1     Running   1          6m22s
[root@master ~]# kubectl expose deployment myapp  --port 8080 --target-port 80
service/myapp exposed

[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    64m
myapp        ClusterIP   10.96.152.160   <none>        8080/TCP   39s

[root@master ~]# curl 10.96.152.160:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

edit 编辑

[root@master ~]# kubectl run nginx --image nginx --labels "app=amu"
pod/nginx created

[root@master ~]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          20s

// 编辑标签
[root@master ~]# kubectl edit pods/nginx
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-12-20T01:11:59Z"
  labels:
    app: test		// 修改这里
  name: nginx
......以下省略	// 编译完成 ZZ 或者 wq!退出
pod/nginx edited


// 查看nginx描述
[root@master ~]# kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         node2.example.com/192.168.91.135
Start Time:   Mon, 20 Dec 2021 09:11:59 +0800
Labels:       app=test		// 标签修改成功
Annotations:  <none>
Status:       Running
IP:           10.244.2.10
......一下省略

scale 扩展

[root@master ~]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-h2zvv   1/1     Running   0          3m8s

// 动态扩展:之前只有一个,现在变成五个
[root@master ~]# kubectl scale --replicas 5 deployment/nginx
deployment.apps/nginx scaled
[root@master ~]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-7jdqg   1/1     Running   0          40s
nginx-85b98978db-h2zvv   1/1     Running   0          4m47s
nginx-85b98978db-k4twc   1/1     Running   0          40s
nginx-85b98978db-lvxq8   1/1     Running   0          40s
nginx-85b98978db-zltqr   1/1     Running   0          40s

// 当你不需要那么多的 deployment/nginx 时候,你可以指定你想留下几个,他会随机删除不需要的
[root@master ~]# kubectl scale --replicas 3 deployment/nginx
deployment.apps/nginx scaled
[root@master ~]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-7jdqg   1/1     Running   0          77s
nginx-85b98978db-h2zvv   1/1     Running   0          5m24s
nginx-85b98978db-k4twc   1/1     Running   0          77s

autoscale 自动扩展
min:最少扩展
max:最大扩展
percent:百分比

[root@master ~]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-7jdqg   1/1     Running   0          77s
nginx-85b98978db-h2zvv   1/1     Running   0          5m24s
nginx-85b98978db-k4twc   1/1     Running   0          77s

// 最少1个,最多5个,cpu占比50%
[root@master ~]# kubectl autoscale --min 1 --max 5 --cpu-percent 50 deployment/nginx
horizontalpodautoscaler.autoscaling/nginx autoscaled 	// hpa类型

// 查看运行情况
[root@master ~]# kubectl get hpa
NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   <unknown>/50%   1         5         5          23s

// 自动扩展成功
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-5gsrk   1/1     Running   0          7m56s
nginx-85b98978db-7jdqg   1/1     Running   0          13m
nginx-85b98978db-h2zvv   1/1     Running   0          17m
nginx-85b98978db-k4twc   1/1     Running   0          13m
nginx-85b98978db-ttzh6   1/1     Running   0          7m56s

// 删除所有 deployment类型的 nginx
[root@master ~]# kubectl delete deployment/nginx
deployment.apps "nginx" deleted

describe 描述

// 查看test容器的描述
[root@master ~]# kubectl describe pod/test
Name:         test
Namespace:    default
Priority:     0
Node:         node1.example.com/192.168.91.137
Start Time:   Mon, 20 Dec 2021 09:39:51 +0800
Labels:       run=test
Annotations:  <none>
Status:       Running
IP:           10.244.1.17
......

logs 查看日志

// 默认pod类型。不是pod类型,需要指定,比如是 deployment类型的,就是deployment/tests
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          34m


[root@master ~]# kubectl logs test
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/12/20 01:40:08 [notice] 1#1: using the "epoll" event method
2021/12/20 01:40:08 [notice] 1#1: nginx/1.21.4
2021/12/20 01:40:08 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2021/12/20 01:40:08 [notice] 1#1: OS: Linux 4.18.0-257.el8.x86_64
2021/12/20 01:40:08 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/12/20 01:40:08 [notice] 1#1: start worker processes
2021/12/20 01:40:08 [notice] 1#1: start worker process 31
2021/12/20 01:40:08 [notice] 1#1: start worker process 32

exec 查看容器

// 进去容器执行命令
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          43m

// pod类型查看日期
[root@master ~]# kubectl exec test -- date
Mon Dec 20 02:23:45 UTC 2021

// 使用交互模式进入
[root@master ~]# kubectl exec -it test -- /bin/bash
root@test:/# ls
bin   docker-entrypoint.d   home   media  proc  sbin  tmp
boot  docker-entrypoint.sh  lib    mnt    root  srv   usr
dev   etc                   lib64  opt    run   sys   var
root@test:/# exit
exit

# deployment
// 创建一个deployment类型的nginx容器
[root@master ~]# kubectl create deployment nginx --image nginx
deployment.apps/nginx created

[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-mns5l   1/1     Running   0          28s
test                     1/1     Running   0          45m

// deployment类型查看日期
[root@master ~]# kubectl exec nginx-85b98978db-mns5l -- date 
Mon Dec 20 02:25:19 UTC 2021


[root@master ~]# kubectl exec -it nginx-85b98978db-mns5l /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.	// 未来会删除这个功能
root@nginx-85b98978db-mns5l:/# ls
bin   docker-entrypoint.d   home   media  proc  sbin  tmp
boot  docker-entrypoint.sh  lib    mnt    root  srv   usr
dev   etc                   lib64  opt    run   sys   var

# svc
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   46h
nginx        ClusterIP   10.108.208.249   <none>        80/TCP    56m

// svc类型查看日期
[root@master ~]# kubectl exec svc/nginx -- dateMon Dec 20 02:31:08 UTC 2021

[root@master ~]# kubectl exec -it svc/nginx /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.	// 未来会删除这个功能
# ls
bin   docker-entrypoint.d   home   media  proc  sbin  tmp
boot  docker-entrypoint.sh  lib    mnt    root  srv   usr
dev   etc                   lib64  opt    run   sys   var

端口转发

[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
nginx-85b98978db-mns5l   1/1     Running     0          19m

[root@master ~]# kubectl port-forward deployment/nginx 80	// 容器是80,本机也是80
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80

// 访问测试
[root@master ~]# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>


[root@master ~]# kubectl port-forward deployment/nginx :80	// 本机随机端口,容器80端口
Forwarding from 127.0.0.1:41165 -> 80
Forwarding from [::1]:51165 -> 80
Handling connection for 41165

// 访问测试
[root@master ~]# curl 127.0.0.1:41165
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>


// 隐藏IP地址
[root@master ~]# kubectl port-forward --address 0.0.0.0 deployment/nginx :80
Forwarding from 0.0.0.0:32841 -> 80

cp 复制

[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
nginx-85b98978db-mns5l   1/1     Running     0          41m
test                     1/1     Running     0          10m

// 现在 test容器里面的tmp目录没有文件
[root@master ~]# kubectl exec test -- ls /tmp/

[root@master ~]# ls
anaconda-ks.cfg  init  kube-flannel.yml

// 我把本机家目录下的 anaconda-ks.cfg文件复制到 test容器的 tmp目录下
[root@master ~]# kubectl cp /root/anaconda-ks.cfg test:/tmp/ 
[root@master ~]# kubectl exec test -- ls /tmp/
anaconda-ks.cfg

overwrite 覆盖

// 运行一个pod类型的nginx容器,标签设置为app=nginx
[root@master ~]# kubectl run nginx --image nginx --labels "app=test"
pod/nginx created

// 查看描述情况
[root@master ~]# kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         node1.example.com/192.168.91.137
Start Time:   Mon, 20 Dec 2021 10:57:33 +0800
Labels:       app=test		// 标签设置成功
Annotations:  <none>
Status:       Running
IP:           10.244.1.19
......

[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
busybox                  0/1     Completed   0          19m
nginx                    1/1     Running     0          21s
nginx-85b98978db-mns5l   1/1     Running     0          33m
test                     1/1     Running     0          78m

// 使用 app=test 覆盖掉原有的 app=nginx 标签
[root@master ~]# kubectl label pod nginx --overwrite app=JJ
pod/nginx unlabeled


// 查看描述情况
[root@master ~]# kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         node1.example.com/192.168.91.137
Start Time:   Mon, 20 Dec 2021 10:57:33 +0800
Labels:       app=JJ		// 标签覆盖成功
Annotations:  <none>
Status:       Running
IP:           10.244.1.19
.......

label 添加标签

// 添加标签
[root@master ~]# kubectl label pod nginx ZZ=MM
pod/nginx labeled

// 查看描述情况
[root@master ~]# kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         node1.example.com/192.168.91.137
Start Time:   Mon, 20 Dec 2021 10:57:33 +0800
Labels:       app=amu
              ZZ=MM		// 标签添加成功,这里不是覆盖了

api-resources 查看api资源详细信息

[root@master ~]# kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume

api-versions api可以版本号

[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
coordination.k8s.io/v1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
flowcontrol.apiserver.k8s.io/v1beta2
networking.k8s.io/v1
node.k8s.io/v1
node.k8s.io/v1beta1

自动扩展

[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-dldgp   1/1     Running   0          8s

// 删除nginx容器
[root@master ~]# kubectl delete pod nginx-85b98978db-dldgp
pod "nginx-85b98978db-dldgp" deleted

// 虽然我们删除了nginx容器,由于自动创建(最少一个),它又自动重新创建了一个nginx容器
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-7ppd8   1/1     Running   0          9s

// 删除 deployment控制器
[root@master ~]# kubectl delete deployment nginx
deployment.apps "nginx" deleted

// 控制器删除了,自动创建就失效了,不会再自动创建
[root@master ~]# kubectl get pods
No resources found in default namespace.

创建随机端口访问nginx页面

// 创建一个deployment类型的nginx容器,映射本机端口8080,容器内端口映射80
[root@master ~]# kubectl create deployment nginx --image nginx
deployment.apps/nginx created

// 暴露本机端口8080,容器内端口映射80,类型为节点端口
[root@master ~]# kubectl expose deployment nginx --port 8080 --target-port 80 --type NodePort
service/nginx exposed
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          143m
nginx        NodePort    10.101.228.12   <none>        8080:31788/TCP   3s

[root@master ~]# curl 10.101.228.12:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

在这里插入图片描述
滚动更新

//构建镜像
[root@master ~]# mkdir apache

// 编写 dockerfile文件
[root@master ~]# cat apache/Dockerfile 
FROM busybox

RUN mkdir /data && \
echo "hello" > /data/index.html

ENTRYPOINT ["/bin/httpd","-f","-h","/data"]


// 创建两个不同版本的镜像
[root@master ~]# docker build -t zhaojie10/httpd:v1 apache/
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
latest: Pulling from library/busybox
3cb635b06aa2: Pull complete 
Digest: sha256:b5cfd4befc119a590ca1a81d6bb0fa1fb19f1fbebd0397f25fae164abe1e8a6a
Status: Downloaded newer image for busybox:latest
 ---> ffe9d497c324
Step 2/3 : RUN mkdir /data &&     echo "hello amu,This is test1" > /data/index.html
 ---> Running in 2400a9edc3b7
Removing intermediate container 2400a9edc3b7
 ---> b596ff036149
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
 ---> Running in 9bad15d04393
Removing intermediate container 9bad15d04393
 ---> 21d6bd11fd0d
Successfully built 21d6bd11fd0d
Successfully tagged zhaojie10/httpd:v1


[root@master ~]# cat apache/Dockerfile 
FROM busybox

RUN mkdir /data && \
echo "world" > /data/index.html

ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
[root@master ~]# docker build -t zhaojie10/httpd:v2 apache/ 
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> ffe9d497c324
Step 2/3 : RUN mkdir /data &&     echo "hello amu,This is test2" > /data/index.html
 ---> Using cache
 ---> b596ff036149
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
 ---> Using cache
 ---> 21d6bd11fd0d
Successfully built 21d6bd11fd0d
Successfully tagged zhaojie10/httpd:v2

// 上传镜像
[root@master ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zhaojie10
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

// 上传镜像当 docker.hub仓库 
[root@master ~]# docker push zhaojie10/httpd:v1
The push refers to repository [docker.io/zhaojie10/httpd]
88be387e4d70: Pushed 
64cac9eaf0da: Mounted from library/busybox 
v1: digest: sha256:074bdf0f11e9ee6f4efb2c12f67fdfab4eae8472fae1a75eb5004f3e5884ad3e size: 734

[root@master ~]# docker push zhaojie10/httpd:v2
The push refers to repository [docker.io/gaofan1225/httpd]
88be387e4d70: Pushed 
64cac9eaf0da: Layer already exists 
v2: digest: sha256:074bdf0f11e9ee6f4efb2c12f67fdfab4eae8472fae1a75eb5004f3e5884ad3e size: 734

// 创建一个httpd容器,使用v1版本的,并复制成三个
[root@master ~]# kubectl create deployment httpd --image zhaojie10/httpd:v1 --replicas 3
deployment.apps/httpd created

[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
httpd-8556845dfd-gct9q   1/1     Running   0          58s
httpd-8556845dfd-hcqrk   1/1     Running   0          58s
httpd-8556845dfd-zv9qz   1/1     Running   0          58s

// 暴露端口
[root@master ~]# kubectl expose deployment httpd --port 80 --target-port 80
service/httpd exposed
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
httpd        ClusterIP  10.110.176.8   <none>        80/TCP    6s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   3m35s

// 访问测试
[root@master ~]# curl 10.110.176.8
hello 


// 升级版本
[root@master ~]# kubectl set image deployment/httpd httpd=zhaojie10/httpd:v2
deployment.apps/httpd image updated

// 访问测试
[root@master ~]# curl 10.110.176.8
world


回滚

// 回滚,返回上个版本
[root@master ~]# kubectl rollout undo deployment/httpd
deployment.apps/nginx rolled back

// 访问测试
[root@master ~]# curl 10.110.176.8
hello 

4.4 通过资源定义方式创建haproxy的pod进行负载均衡

  • 重启策略
    Always:当容器终止退出后,总是重启容器,默认策略。

    OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。

    Never:当容器终止退出,从不重启容器。

  • 健康检查类型
    livenessProbe (存活检查)∶如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。

    readinessProbe (就绪检查)︰如果检查失败,Kubernetes会把Podservice endpoints中剔除。

#端口探测
apiVersion: v1
kind: Pod
metadata:
  name: probe-demo
  namespace: demo
spec:
containers:
- name: web
  image: nginx
  ports:
  - containerPort: 80
  livenessProbe:
    tcpSocket:
      port: 80
    initialDelaySeconds: 60#启动容器后多少秒健康检查
    periodSeconds: 30#以后间隔多少秒检查一次
  readinessProbe:
    tcpSocket:
      port: 80
    initialDelaySeconds: 60
    periodSeconds: 30

示例:执行Shell命令
livenessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
    
示例:HTTP请求
livenessProbe:httpGet:
  httpGet:
    path: /healthz
    port: 8080
    httpHeaders:
    - name: Custom-Header
      value: Awesome

  • 支持的检查方法
    httpGet:发送HTTP请求,返回200-400范围状态码为成功。
    exec:执行Shell命令返回状态码是0为成功。
    tcpSocket:发起TCP Socket建立成功。
  • 初始化容器
    InitContainer:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务
    支持大部分应用容器配置,但不支持健康检查
    优先应用容器执行

yml文件

//haproxy文件
[root@master haproxy]# cat haproxy.yml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: haproxy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: haproxy
  template:
    metadata:
      labels:
        app: haproxy
    spec:
      initContainers:
      - name: cp
        volumeMounts:
        - name: haproxy-cfg
          mountPath: /tmp/
      restartPolicy: Always		#健康检查出问题就重启容器
      containers:
      - image: zhaojie10/haproxy:latest
        imagePullPolicy: Always
        env: 
        - name: RSs
          value: "10.164.44.10 10.164.44.153"
        name: haproxy
        ports:
        - containerPort: 80
          hostPort: 80
        livenessProbe:	#检查80端口是否存在
          tcpSocket:
            port: 80
      volumes:
      - name: haproxy-cfg
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: haproxy
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: haproxy
  type: NodePort


//RS1文件
[root@master haproxy]# cat nginx.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      initContainers:
      - name: in
        command:
        - "wget"
        - "-O"
        - "/usr/local/nginx/html"
        - "http://www.baidu.com"
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: "/usr/local/nginx/html"
          name: document-root
      containers:
      - image: zhaojie10/nginx:v0.2
        imagePullPolicy: Always
        name: nginx

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels: 
    app: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  clusterIP: 10.164.44.10


//RS2文件
[root@master haproxy]# cat apache1.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
  labels:
    app: httpd
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - image: zhaojie10/httpd:v0.2
        imagePullPolicy: Always
        name: httpd

---
apiVersion: v1
kind: Service
metadata:
  name: httpd
  labels: 
    app: httpd
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: httpd1
  clusterIP: 10.164.44.153

//使用资源定义的文件创建pod
[root@master haproxy]# kubectl create -f haproxy.yml 
deployment.apps/haproxy created
service/haproxy created

//查看是否创建成功
[root@master haproxy]# kubectl get pod,svc
NAME                           READY   STATUS    RESTARTS   AGE
pod/haproxy-7565dc6587-h8sdg   1/1     Running   0          18s
pod/httpd-57c7b6f7cb-sk86h    1/1     Running   0          81s
pod/nginx-7cf8bc594f-t5btg    1/1     Running   0          2m45s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/haproxy      NodePort    10.99.52.161   <none>        80:31884/TCP   18s
service/httpd        ClusterIP   10.97.0.10     <none>        80/TCP         81s
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        76m
service/nginx        ClusterIP   10.97.0.50     <none>        80/TCP         2m45s


//访问测试
[root@master haproxy]# curl 192.168.25.146:31664
<html><body><h1>It works!</h1></body></html>

[root@master haproxy]# curl 192.168.25.146:31664
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐