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控制器