k8s中最为重要的基础资源,pod,pod controller,service

pod controller类型有多种需要向控制器赋值之后使用:

kubectl命令使用

kubectk get nodes/pod/deployment/ns  name#查询节点,pod,控制器。名称空间
kubectl delete pod|ns... name #删除名称空间,pod
[root@node1 ~]# kubectl create namespace myns
namespace/myns created
[root@node1 ~]# kubectl get ns
NAME STATUS AGE
default Active 167m
kube-node-lease Active 167m
kube-public Active 167m
kube-system Active 167m
myns Active 2m11s kubectl get namespace myns -o wide| -o yaml #显示详细信息或者yml格式信息
kubectl describe resource(资源) name(名称) #显示当前资源创建状态 kubectl get namespace myns -o wide| -o yaml #显示详细信息或者yml格式信息

[root@node1 ~] kubectl create deploy myweb --image=nginx:1.14-alpine  #创建一个deploy控制器。此控制器会创建一个pod资源。如果不指定名称空间则会在默认名称空间中
[root@node1 ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/myweb-5f8b88984c-476rn 1/1 Running 0 26s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 177m NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myweb 1/1 1 1 26s NAME DESIRED CURRENT READY AGE
replicaset.apps/myweb-5f8b88984c 1 1 1 26s
[root@node1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-5f8b88984c-476rn 1/1 Running 0 2m29s 10.244.1.2 node3 <none>



使用pod的ip即可访问,如果手动删除此pod,deploy控制器则会自动重新创建一个pod



虽然会自动重建一个容器,但是ip以及名称会变化,一般使用service资源绑定后端pod资源

kubectl create service clusterip myweb --tcp=80:80 #创建一个service资源。会自动关联至myweb这个deploy资源中的pod中。此service资源中的地址很少会便。几十后端podip地址经常变动,也可以使用service资源ip访问到后端pod



由于service资源中的ip地址也有可能会变动。则可以使用service名称来或者label绑定

kubectl create service nodeport myapp --tcp=80:80 #创建nodeport类型端口,此类型会在k8s集群中每一台主机中打开一个端口绑定至后端主机

[root@node1 ~]# kubectl create service nodeport myweb --tcp=80:80
service/myweb created
[root@node1 ~]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h37m <none>
myweb NodePort 10.100.112.31 <none> 80:30593/TCP 4s app=myweb





在宿主机外使用宿主机地址加端口访问集群内部pod

kubectl api-versions #查看api资源版本

[root@node1 ~]# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

资源对象的配置格式

apiVersion:api版本类型

kind:类型

metadata:元数据字段,可嵌套

spec:用户自定义期望状态:可嵌套

status:实际状态,是有k8s集群自行维护

kubectl api-resources##查看当前k8s之前的所有支援类型

自定义简单的配置清单

[root@node1 ~]# vim ns.yml
apiVersion: v1
kind: Namespace
metadate:
name: develop
[root@node1 ~]# kubectl apply -f ns.yml #使用apply -f 部署yml文件中的配置清单
namespace/develop created

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.16/

k8s官方资源配置文档

kubectl get pod myweb-5f8b88984c-nhmt9 -o yaml --export ##也可以使用--export将pod的配置导出作为模板。

apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: pod-demo #pod名称
namespace: develop #属于哪个名称空间
spec:
containers:
- image: iKubernetes/myapp:v1 #拉取镜像
imagePullPolicy: IfNotPresent #表示如果本地有镜像则从本地镜像启动,如果没有则去网上拉取镜像
name: myapp #pod中运行的容器名称
resources: {} #定义资源限制,比如多少cpu,内存等
dnsPolicy: ClusterFirst #dns策略,clusterfirst为k8s默认dns策略
priority: 0 #定义优先级
restartPolicy: Always #重启策略,定义pod宕机时,则有controller重启pod
schedulerName: default-scheduler #由哪个调度器调度
securityContext: {} #安全上下文 [root@node1 ~]#kubectl apply -f pod.yml
[root@node1 ~]# kubectl get pod -n develop
NAME READY STATUS RESTARTS AGE
pod-demo 1/1 Running 0 22s

explain 可查看核心资源类型定义字段。

kubectl explain pods.spec.hostIPC #可一级一级往下查看字段内容

在一个pod中创建两个容器

[root@node1 ~]# vim pod-2.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo-2
namespace: prod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
- name: bbox
image: busybox
imagePullPolicy: ifNotPresent
command: ["/bin/sh","-c","sleep 86400"]
~

[root@node1 ~]# kubectl exec pod-demo-2 -c bbox -n prod -it -- /bin/sh #连接容器内部

/ # netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
/ #

此busybox没有默认运行程序为bin/sh。这里的监听端口为第一个myapp容器提供,两个容器是共享pod中的网络

kubectl logs myweb-5f8b88984c-nhmt9 ##查看pod中日志

spec.network字段可定义pod直接共享宿主机的网络,外部可直接访问宿主机

[root@node1 ~]# vim pod-3.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo-3
namespace: prod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
hostNetwork: true
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
也可使用宿主机端口映射至内部pod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- protocol: TCP
containerPort: 80
name: http
hostPort: 8080



且只能在被调度的节点上使用8080端口访问。

label标签

由键前缀和键名组成,键前缀必须为dns域名。标签用来将service和pod controller来关联至后端pod,k8s中service和pod资源 ip和名称可能会发生变化,但是标签不会变。

标签选择器用于表达标签查询条件或者选择标准。

matchLabels:通过直接给定键值对指定标签选择器

[root@node1 ~]# kubectl get pods --show-labels  #查看pod标签选择器
NAME READY STATUS RESTARTS AGE LABELS
myweb-5f8b88984c-nhmt9 1/1 Running 0 19h app=myweb,pod-template-hash=5f8b88984c

直接在metadata字段指定labels标签。可以指定多个键,这里为app和rel



[root@node1 ~]# kubectl label pod pod-demo -n prod tier=frontend #可使用kubectl直接给pod打上标签。

--overwrite覆盖掉之前标签修改

"key-" 在键后面使用减号删除

-l app=myapp #过滤标签

-L app 过滤出所有带有app这个键的资源

[root@node1 ~]# kubectl get pod -n prod --show-labels -l rel=stable
NAME READY STATUS RESTARTS AGE LABELS
pod-demo-2 2/2 Running 0 12m app=pod-demo,rel=stable
[root@node1 ~]#

Pod生命周期

一阶段,初始容器阶段

1,容器刚刚创建完成,可能需要环境初始化,在核心容器启动之前由一个容器将主页或者其他配置信息拉取或者配置好退出

2阶段,主容器运行阶段

pod.sepc.containers.lifecycle定义了容器运行之前和结束之前命令,其中由两个字段poststart,prestop。用来定义开始和结束之前运行的命令

https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/

apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle: #定义容器的生命周期字段
postStart: #开始之前
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop: #结束之前
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

2,正常运行阶段

健康状态检查,如果检查失败,则重启容器,且不会一直马上重启,会有一个时间检测间隔。

pod.spec.containers.livenessProbe:定义正常运行阶段pod中容器的健康状态检测

使用liveness健康状态来检测容器
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness-exec
name: liveness-exec
spec:
containers:
- name: liveness-demo
image: busybox
args: #此字段定义容器主程序运行命令
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 30
livenessProbe: #健康状态检测
exec: #exec表示使用自定义shell命令来检测,此检测表示探测容器中healthy文件是否存在
command:
- test
- -e
- /tmp/healthy



之后会看见此pod重启次数会增加,现在是2次

使用lifecycle定义启动容器之后创建一个文件,livenessProbe使用HTTP来检测网页的方式来做健康状态检测
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness-demo
image: nginx:1.12-alpine
ports:
- name: http
containerPort: 80
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- 'echo Healty > /usr/share/nginx/html/healthz'
livenessProbe:
httpGet: #使用http请求方式检测容器状态
path: /healthz #http请求路径
port: http
scheme: HTTP
periodSeconds: 2 #间隔检测
failureThreshold: 2 #失败次数
initialDelaySeconds: 3 #初始化3秒后检测

就绪状态检测:

pod.sepc.containers.readinessProbe(无权力重启容器)配置参数于livenessProbe相似

##删除一个文件,睡眠30秒之后在创建。创建之后30秒后则检测就绪成功
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness-exec
name: readiness-exec
spec:
containers:
- name: readiness-demo
image: busybox
args: ["/bin/sh", "-c", "while true; do rm -f /tmp/ready; sleep 30; touch /tmp/ready; sleep 300; done"]
readinessProbe:
exec:
command: ["test", "-e", "/tmp/ready"]
initialDelaySeconds: 5 # 延迟5秒中检测
periodSeconds: 5 #检测5次

3,容器结束之前

2阶段,主容器运行阶段

pod相位

pod对象应该总是处于以下几个相位中

Pending:API创建pod资源并且存入etcd中,但尚未调度完成或者处于下载镜像中

Running:Pod以被调度至某节点,所有容器都被kubelet创建完成

Succeeded:Pod中所有容器成功终止并且不会被重启

Failed:所有容器中止,但至少有一个容器终止失败,

Unknown:API server 无法正常获取到Pod对象的状态信息。通常由于无法于所在节点kubelet通信导致

Pod对象容器的重启策略

Always:但凡Pod对象终止就重启,为默认设定

OnFailure:仅在Pod对象出现错误时才将其重启,手动终止则不会重启

Never:从不重启

kubectl explain pod.spec.containers.resources #定义资源范围

limits:定义资源上限

requests:资源下线,低于下线值则pod不会启动

apiVersion: v1
kind: Pod
metadata:
name: stress-pod
spec:
containers:
- name: stress
image: ikubernetes/stress-ng
command: ["/usr/bin/stress-ng", "-c 1", "-m 1", "--metrics-brief"]
resources: #定义资源限制
requests: #下限
memory: "128Mi" #定义内存下限为128M
cpu: "200m" #CPU为0.2个核心
limits:#上限
memory: "512Mi" #定义上限不超过512M内存
cpu: "400m" #上限为0.4个核心

Pod服务质量类别

Guaranteed.

Burstable

BestEffort

Pod控制器

Pod controller 类型

ReplicaSet:用于控制无状态应用

spec字段:

Pod Template:定义Pod的模板,控制器以此模板创建pod 。

Pod Selector:控制器通过标签识别那些Pod为自己管理,

Replicas:用户期望的pod数量

RS配置示例
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs
namespace:prod
spec:
replicas: 2 #Pod复本数
selector: #标签选择器
matchLabels: #使用标签匹配
app: myapp-pod #app=myapp-pod
template: #定义pod模板
metadata: #Pod元数据
labels: #Pod的模板
app: myapp-pod #定义Pod的标签需要与控制器的标签选择相同否则的话会一直创建pod却匹配不到Pod
spec: #Pod的创建字段
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80 [root@node1 chapter5]# kubectl get pods -n prod
NAME READY STATUS RESTARTS AGE
myapp-rs-cjx5q 0/1 ContainerCreating 0 8s
myapp-rs-jqhwf 1/1 Running 0 8s
pod-demo-2 2/2 Running 0 24h
pod-demo-3 1/1 Running 0 42h
[root@node1 chapter5]# kubectl get rs -n prod
NAME DESIRED CURRENT READY AGE
myapp-rs 2 2 2 13s
[root@node1 chapter5]#

Deployment Pod控制器配置示例


apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
spec:
replicas: 3
minReadySeconds: 10
# strategy: #更新策略,可利用此策略实现金丝雀更新
# rollingUpdate:
# maxSurge: 1 #允许多一个
# maxUnavailable: 1 #允许少一个,
# type: RollingUpdate #滚动更新
selector:
matchLabels:
app: myapp
rel: stable
template:
metadata:
labels:
app: myapp
rel: stable
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
name: http
readinessProbe:
periodSeconds: 1
httpGet:
path: /
port: http Deploy 控制器创建完成后会自动创建一个rs控制器由RS控制器管理pod。deploy控制着rs
[root@node1 chapter5]# kubectl apply -f deploy-nginx.yaml
deployment.apps/deploy-nginx created
[root@node1 chapter5]# kubectl get pods
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 0 23h
myweb-5f8b88984c-nhmt9 1/1 Running 0 45h
[root@node1 chapter5]# kubectl get pods -n prod
NAME READY STATUS RESTARTS AGE
deploy-nginx-6db964bf97-25rbj 1/1 Running 0 8s
deploy-nginx-6db964bf97-tzlw5 1/1 Running 0 8s
deploy-nginx-6db964bf97-ztpwp 1/1 Running 0 8s
[root@node1 chapter5]# kubectl get rs -n prod
NAME DESIRED CURRENT READY AGE
deploy-nginx-6db964bf97 3 3 3 16s
[root@node1 chapter5]#

使用deploy更新时只需要修改yml文件中的image版本,则会自动以滚动放松删除一个pod添加一个更新后的pod

创建过程
[root@node1 chapter5]# kubectl get pods -n prod -w
NAME READY STATUS RESTARTS AGE
deploy-nginx-56c8d75644-zxd6c 1/1 Running 0 11s
deploy-nginx-6db964bf97-25rbj 1/1 Running 0 2m49s
deploy-nginx-6db964bf97-tzlw5 1/1 Running 0 2m49s
deploy-nginx-6db964bf97-ztpwp 1/1 Running 0 2m49s
deploy-nginx-6db964bf97-tzlw5 1/1 Terminating 0 2m56s
deploy-nginx-56c8d75644-czr8j 0/1 Pending 0 0s
deploy-nginx-56c8d75644-czr8j 0/1 Pending 0 0s
deploy-nginx-56c8d75644-czr8j 0/1 ContainerCreating 0 0s
deploy-nginx-6db964bf97-tzlw5 0/1 Terminating 0 2m57s
deploy-nginx-6db964bf97-tzlw5 0/1 Terminating 0 2m58s
deploy-nginx-6db964bf97-tzlw5 0/1 Terminating 0 2m58s
deploy-nginx-56c8d75644-czr8j 0/1 Running 0 7s
deploy-nginx-56c8d75644-czr8j 1/1 Running 0 7s
deploy-nginx-6db964bf97-25rbj 1/1 Terminating 0 3m13s
deploy-nginx-56c8d75644-qn6rz 0/1 Pending 0 0s
deploy-nginx-56c8d75644-qn6rz 0/1 Pending 0 0s
deploy-nginx-56c8d75644-qn6rz 0/1 ContainerCreating 0 0s
deploy-nginx-6db964bf97-25rbj 0/1 Terminating 0 3m14s
deploy-nginx-56c8d75644-qn6rz 0/1 Running 0 7s
deploy-nginx-56c8d75644-qn6rz 1/1 Running 0 8s
deploy-nginx-6db964bf97-25rbj 0/1 Terminating 0 3m24s
deploy-nginx-6db964bf97-25rbj 0/1 Terminating 0 3m24s
deploy-nginx-6db964bf97-ztpwp 1/1 Terminating 0 3m31s
deploy-nginx-6db964bf97-ztpwp 0/1 Terminating 0 3m32s
deploy-nginx-6db964bf97-ztpwp 0/1 Terminating 0 3m33s
deploy-nginx-6db964bf97-ztpwp 0/1 Terminating 0 3m33s

DaemonSets Pod控制器

此控制器会创建出于node数量同等的pod,每个node一个

配置示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat-ds
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
name: filebeat
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env: #此字段表示传递变量进入容器中
- name: REDIS_HOST #变量名
value: db.ikubernetes.io:6379 #变量值
- name: LOG_LEVEL #变量名
value: info
nodeSelector: #节点选择器。
log: "on" #只有当节点有log为on的标签时才会调度至此节点



此控制器会根据node数量创建相应的pod并在每个node运行一个

可以在 pod字段中nodeselector选择调度到相应标签的节点上

k8s之pod与Pod控制器

k8s之pod与Pod控制器的更多相关文章

  1. k8s核心资源之Pod概念&入门使用讲解(三)

    目录 1. k8s核心资源之Pod 1.1 什么是Pod? 1.2 Pod如何管理多个容器? 1.3 Pod网络 1.4 Pod存储 1.5 Pod工作方式 1.5.1 自主式Pod 1.5.2 控制 ...

  2. k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?

    k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方? 面试官:"计数性Job默认完成模式是什么?Indexed模式如何发布自定义索引呢?& ...

  3. k8s运维之pod排错

    k8s运维之pod排错 K8S是一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernetes的目标是让部署容器化变得简单并且高效 K8S的核心优势: 1,基于yaml文件实现容器的自动创建 ...

  4. linux运维、架构之路-K8s通过Service访问Pod

    一.通过Service访问Pod 每个Pod都有自己的IP地址,当Controller用新的Pod替换发生故障的Pod时,新Pod会分配到新的IP地址,例如:有一组Pod对外提供HTTP服务,它们的I ...

  5. Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解

    YAML语法规范:在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义.YAM ...

  6. 12.深入k8s:kubelet创建pod流程源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 在上一篇中,我们知道在kubelet中,工作核心就是围绕着整个syn ...

  7. k8s通过Service访问Pod

    如何创建服务 1.创建Deployment #启动三个pod,运行httpd镜像,label是run:mcw-httpd,Seveice将会根据这个label挑选PodapiVersion: apps ...

  8. 十三、Pod的资源控制器类型

    Pod 的资源控制器类型 一.Pod 的资源控制器类型 什么是控制器呢?简单来说,控制器就好比是影视剧里面的剧本,演员会根据剧本所写的内容来针对不同的角色进行演绎,而我们的控制器就好比是剧本,Kube ...

  9. K8s中的多容器Pod和Pod内容器间通信

    容器(Container)常被用来解决比如微服务的单个问题,但在实际场景中,问题的解决往往需要多容器方案.本文会讨论将多个容器整合进单个Kubernetes Pod 中,以及Pod中的容器之间是如何通 ...

随机推荐

  1. windows下ffmpeg批量转码

    以mp4转mp3为例 for %%i in (*.mp4) do ffmpeg -i "%%i" "%%i.mp3" 将当前文件夹下的mp4文件全部转码为mp3

  2. C# 将DataTable数据写入到txt文件中

    见代码: /// <summary> /// 将DataTable里面的内容写入txt文件 /// </summary> /// <param name="dt ...

  3. InvokeMember 使用(转http://blog.csdn.net/gooer/article/details/2927113)

    函数原型:       public   object   InvokeMember(string,   BindingFlags,   Binder,   object,   object[]); ...

  4. 使用事件和 CQRS 重写 CRUD 系统

    使用事件和 CQRS 重写 CRUD 系统 https://msdn.microsoft.com/zh-cn/magazine/mt790196.aspx https://github.com/mem ...

  5. Vue项目引入百度地图

    先去百度开放平台申请ak.http://lbsyun.baidu.com/ 进来之后 按照步骤走,先登录百度账号,然后申请成为开发者,然后申请ak密钥 填写完毕后提交,会给你邮箱发个激活邮件 点击申请 ...

  6. IDEA中MavenWeb项目没有新建servlet文件

    解决方案: https://blog.csdn.net/Delicious_Life/article/details/89515363

  7. Django框架(十)--ORM多对多关联关系三种创建方式、form组件

    多对多的三种创建方式 1.全自动(就是平常我们创建表多对多关系的方式) class Book(models.Model): title = models.CharField(max_length=32 ...

  8. Linux基础(02)MakeFile的创建和使用

    makefile是生成文件的脚本 , 把当前文件下的.c文件生成.o文件和可执行程序 SRC = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SRC)) C ...

  9. PV、UV、UIP、VV、DAU、CTR指的是什么?

    PV(page view) 网站浏览量,指网页的浏览次数,用户每打开一次页面就记录一次PV,多次打开则累加. UV(unique vistor) 独立访客数,指的是某一天访问某站点的人数,以cooki ...

  10. Navicat Premium 12 安装与破解,Navicat Premium通用的数据库管理工具

    本文转自:https://blog.csdn.net/WYpersist/article/details/86530973 Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同 ...