linux操作文档-k8s资源
Deployment、Service、Pod是k8s最核心的三个资源对象。
Deployment:最常见的无状态应用的控制器,支持应用的扩缩容、滚动更新等操作。
Service:为弹性变动且存在生命周期的Pod对象提供了一个固定的访问接口,用于服务发现和服务访问。
Pod:是运行容器以及调度的最小单位。同一个Pod可以同时运行多个容器,这些容器共享NET、UTS、IPC。除此之外还有USER、PID、MOUNT。
一、创建资源
创建Pod控制器,deployment。可以用来控制多个容器。
创建Service,可以为Pod提供一个统一的访问接口,保证内外网能够访问。默认的type为ClusterIP,集群内任意节点都可访问;type改为NodePort则外网可访问。
1.用命令行的方式创建
1.创建Deployment
创建deployment,名称为web,镜像为nginx,容器数量5
master ~]# kubectl run web --image=nginx --replicas=5
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/web created
查看控制器情况
master ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
web 5/5 5 5 2m9s
查看资源详细信息
master ~]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web 5/5 5 5 3m35s web nginx run=web
PS:加上-n选项可以查看指定的控制器情况
2.创建Service
如果想要外网能够访问服务,可以暴露deployment资源,得到service
资源,但svc资源的类型必须为NodePort(大小写必须严格按照要求)
master ~]# kubectl expose deployment web --name=web-svc --port=80 --type=NodePort
service/web-svc exposed
查看service情况
master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20d
web-svc NodePort 10.111.135.250 <none> 80:32282/TCP 3m59s
3.服务的扩容与缩容
master ~]# kubectl scale deployment web --replicas=7
deployment.extensions/web scaled
master ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
web 7/7 7 7 13m
master ~]# kubectl edit deployments. web
...
spec:
progressDeadlineSeconds: 600
replicas: 7 //数量
revisionHistoryLimit: 10
selector:
matchLabels:
...
4.常用命令集合
命令 | 作用 |
---|---|
kubectl run | 创建一个deployment管理创建的容器 |
kubectl get | 显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源 |
kubectl expose | 将一个资源暴露为一个新的kubernetes的service资源(连接外网) |
kubectl describe | 显示特定资源或资源组的详细信息 |
kubectl scale | 可以对Deployment, ReplicaSet, Replication,Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件 |
kubectl set | 更改现有的应用程序资源 |
kubectl roollout | 资源回滚管理 |
2.使用配置清单创建
一级字段的名称及作用
名称 | 作用 |
---|---|
apiVersion | api版本信息 |
kind | 资源对象的类别 |
metadata | 元数据 名称字段必写 |
spec | 用户期望的状态 |
status | 资源现在处于什么样的状态(非必须) |
1.创建Deployment
可以使用kubectl explain 命令查看我们要写的资源对象的yaml文件怎么
写。比如查看deployment资源的话就可以写成:
master ~]# kubectl explain deploy
KIND: Deployment
VERSION: extensions/v1beta1 //版本信息
DESCRIPTION:
DEPRECATED - This group version of Deployment is deprecated by
apps/v1beta2/Deployment. See the release notes for more information.
Deployment enables declarative updates for Pods and ReplicaSets.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
metadata <Object>
Standard object metadata.
spec <Object>
Specification of the desired behavior of the Deployment.
status <Object>
Most recently observed status of the Deployment.
使用yaml配置文件创建deployment
master ~]# mkdir yaml
master ~]# cd yaml/
master yaml]# vim web2.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: web2
spec:
replicas: 4
template:
metadata:
labels:
app: web2
spec:
containers:
- name: web2
image: nginx
master yaml]# kubectl apply -f web2.yaml //执行命令
deployment.extensions/web2 created
查看执行结果
master yaml]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web 7/7 7 7 45m web nginx run=web
web2 4/4 4 4 5m1s web2 nginx app=web2
2.创建Service(外网可访问)
master yaml]# vim web2-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: web-svc
spec:
type: NodePort // 指定类型,让外网可访问
selector:
app: web2 //使用相同的标签和标签选择器内容,使两个资源对象相互关联
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30033 //指定集群映射端口,范围是30000-32767
master yaml]# kubectl apply -f web2-svc.yaml //执行命令
service/web-svc created
查看执行结果
master yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20d
web-svc NodePort 10.104.94.122 <none> 80:30033/TCP 4s
3.回滚到指定版本
运行一个服务,并记录一个版本信息
master yaml]# kubectl apply -f bdqn.yaml --record
deployment.extensions/bdqn1 created
查看有哪些版本信息
master yaml]# kubectl rollout history deployment
deployment.extensions/bdqn1
REVISION CHANGE-CAUSE
1 kubectl apply --filename=bdqn.yaml --record=true
运行并升级资源,做好记录。
回滚到指定版本
master yaml]# kubectl rollout undo deployment bdqn1 --to-revision=1
deployment.extensions/bdqn1 skipped rollback (current template already matches revision 1)
4.用label控制Pod的位置
添加节点标签
master yaml]# kubectl label nodes node01 disk=ssd
node/node01 labeled
查看节点的label
master yaml]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 25d v1.15.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01 Ready <none> 25d v1.15.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02 Ready <none> 25d v1.15.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux
删除节点标签
master yaml]# kubectl label nodes node01 disk-
node/node01 labeled
master yaml]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 25d v1.15.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01 Ready <none> 25d v1.15.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02 Ready <none> 25d v1.15.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux
编辑yaml文件
nodeSelector: //添加节点选择器
disk: ssd //和标签内容一致
二、ReplicaSet(RS)资源
1.RS资源架构
RS资源是Deployment(高级Pod控制器)创建的直接管理Pod的工具,通过RS实现对Pod的控制。
RS资源并不支持滚动更新策略。
2.RS资源特点
- 确保Pod资源的对象的数量精准
- 确保Pod健康运行
- 弹性伸缩
- 不仅支持基于等值的标签选择器,还支持基于集合的标签选择器。
3.Labesl与selector的关系:
selector拥有选择权,而labels只能被动的被选择。即labels必须全部满足selector的要求,才能被匹配。
常用标签:
标签分类 | 标签名称 |
---|---|
release(版本) | stable(稳定版)、canary(金丝雀版)、beta(测试版) |
environment(环境变量) | dev(开发)、qa(测试)、production(生产) |
application(应用) | ui、as、ps、sc |
tier(架构层级) | frontend(前端)、backend(后端)、cache(缓存) |
partition(分区) | customerA(客户A)、custonerB(客户B) |
track(品控级别) | daily(每天)、weekly(每周) |
4.架构实操展示
创建一个Deployment以后测试
master yaml]# kubectl describe deployments. bdqn1
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 93s deployment-controller Scaled up replica set bdqn1-5d4fcb99f8 to 5
PS:Events:事件提示。描述了整个资源从开始到现在都做了哪些工作。
由此看出Deployment并没有直接控制Pod,而是创建了一个ReplicaSet资源。
master yaml]# kubectl describe rs bdqn1-5d4fcb99f8
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 9m25s replicaset-controller Created pod: bdqn1-5d4fcb99f8-w6zkh
Normal SuccessfulCreate 9m25s replicaset-controller Created pod: bdqn1-5d4fcb99f8-7rxjc
Normal SuccessfulCreate 9m25s replicaset-controller Created pod: bdqn1-5d4fcb99f8-kkctr
Normal SuccessfulCreate 9m25s replicaset-controller Created pod: bdqn1-5d4fcb99f8-zm5w4
Normal SuccessfulCreate 9m25s replicaset-controller Created pod: bdqn1-5d4fcb99f8-tx8gr
由此看出RS资源对各个Pod进行控制。
三、Service资源
1.Service网络类型
默认情况下Service的网络类型为ClusterIP,yaml文件中的spec.ports.port字段描述的是ClusterIP的端口,供k8s集群内的Pod使用。
想要让外网能够访问到Pod,需要改为NodePort.
2.Service的负载均衡原理
默认使用的是iptables规则。
SNAT:Source NAT(源地址转换)
DNAT: Destination NAT (目标地址转换)
MASQ:动态的源地址转换
查看各个Pod
master yaml]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
bdqn1-5d4fcb99f8-7rxjc 1/1 Running 0 42m 10.244.2.2 node02 <none> <none>
bdqn1-5d4fcb99f8-kkctr 1/1 Running 0 42m 10.244.1.4 node01 <none> <none>
bdqn1-5d4fcb99f8-tx8gr 1/1 Running 0 42m 10.244.2.3 node02 <none> <none>
bdqn1-5d4fcb99f8-w6zkh 1/1 Running 0 42m 10.244.1.3 node01 <none> <none>
bdqn1-5d4fcb99f8-zm5w4 1/1 Running 0 42m 10.244.1.2 node01 <none> <none>
通过iptables规则验证负载均衡
master yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bdqn-svc NodePort 10.99.118.33 <none> 1000:32034/TCP 7s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25d
master yaml]# iptables-save |grep 10.99.118.33
...
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.99.118.33/32 -p tcp -m comment --comment "default/bdqn-svc: cluster IP" -m tcp --dport 1000 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.99.118.33/32 -p tcp -m comment --comment "default/bdqn-svc: cluster IP" -m tcp --dport 1000 -j KUBE-SVC-JJGYWDY4HBOKLHP2
master yaml]# iptables-save |grep KUBE-SVC-JJGYWDY4HBOKLHP2
...
-A KUBE-SEP-NFBERJ5UU7MLBDZW -s 10.244.2.3/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-NFBERJ5UU7MLBDZW -p tcp -m tcp -j DNAT --to-destination 10.244.2.3:80
-A KUBE-SVC-JJGYWDY4HBOKLHP2 -j KUBE-SEP-NFBERJ5UU7MLBDZW
验证得流量从10.99.118.33跳转到了10.244.2.3,实现了负载均衡。
四、Pod资源
一个Pod中可以运行多个Container,但是一般都只运行一个。
例:一个Pod中创建多个容器的方法:
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name:test-app
image: httpd
- name: test-web
image: busybox
一个Pod内的多个容器共用NET(网络栈)、UTS(主机名\域名)、IPC(共享内存\消息队列)。
一旦一个容器坏掉,则整个Pod都无法正常工作。故而一般一个Pod内只有一个容器。
1.名称空间(Namespace)
namespace资源对象仅用于资源对象的隔离,并不能隔绝不同名称空间的Pod之间的通信,那是网络策略资源的功能。
查看名称空间
master ~]# kubectl get ns
NAME STATUS AGE
default Active 32d
kube-node-lease Active 32d
kube-public Active 32d
kube-system Active 32d
查看名称空间详细信息
master ~]# kubectl describe ns default
Name: default
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
No resource limits.
创建名称空间
master ~]# kubectl create ns bdqn
namespace/bdqn created
删除名称空间
master ~]# kubectl delete ns bdqn
namespace "bdqn" deleted
2.镜像获取策略
kind: Pod
apiVersion: v1
metadata:
name: pod1
spec:
containers:
- name: pod1
image: httpd
imagePullPolicy: IfNotPresent
k8s默认根据镜像的TAG不同,有三种不同的策略。
Always:镜像标签为“latest”或镜像标签不存在时,总是从指定的仓库(默认的官方仓库、或者私有仓库)中获取最新镜像。
IfNotPresent:仅当本地镜像不存在时才从目标仓库中下载。也意味着,如果本地存在,直接使用本地镜像,无需再联网下载。
Never:禁止从仓库中下载镜像,只能使用本地镜像。
PS:对于标签为“latest”或者这标签不存在,其默认镜像下载策略为"Always",而对于其他标签的镜像,默认使用了“IfNotPresent”。
3.容器的重启策略
kind: Pod
apiVersion: v1
metadata:
name: pod1
spec:
restartPolicy: OnFailure
containers:
- name: pod1
image: httpd
imagePullPolicy: IfNotPresent
三种容器重启策略
Always:但凡Pod对象终止就想起重启,此为默认设定。
OnFailure:仅在Pod对象出现错误时才将其重启。
Never:从不重启。
4.Pod的默认健康检查
根据重启策略进行健康检查
kind: Pod
apiVersion: v1
metadata:
name: bdqn
spec:
restartPolicy: OnFailure
containers:
- name: bdqn
image: busybox
args:
- /bin/sh
- -c
- sleep 10 ; exit 1
aster yaml]# kubectl get po -w
NAME READY STATUS RESTARTS AGE
bdqn 1/1 Running 0 7s
pod1 1/1 Running 0 13m
bdqn 0/1 Error 0 14s
bdqn 1/1 Running 1 16s
bdqn 0/1 Error 1 26s
1.LivenessProbe(活跃度、存活性)
Liveness活跃度探测,根据探测某个文件是否存在,来确认某个服务是否正常进行,如果存在则正常,否则它会根据你设置的Pod的重启策略操作Pod。
kind: Pod
apiVersion: v1
metadata:
name: liveness
labels:
test: liveness
spec:
restartPolicy: OnFailure
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/test; sleep 10 ; rm -rf /tmp/test; sleep 30
livenessProbe:
exec:
command:
- cat
- /tmp/test
initialDelaySeconds: 5 //Pod运行5秒后开始探测
periodSeconds: 2 //每2秒探测一次
master yaml]# kubectl get pod liveness -w
NAME READY STATUS RESTARTS AGE
liveness 1/1 Running 0 14s
liveness 1/1 Running 1 46s
liveness 1/1 Running 2 88s
liveness 1/1 Running 3 2m12s
2.Readiness(敏捷探测、就绪性探测)
kind: Pod
apiVersion: v1
metadata:
name: readiness
labels:
test: readiness
spec:
restartPolicy: OnFailure
containers:
- name: readiness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/test; sleep 10 ; rm -rf /tmp/test; sleep 30
readinessProbe:
exec:
command:
- cat
- /tmp/test
initialDelaySeconds: 5
periodSeconds: 2
@master yaml]# kubectl get pod readiness -w
NAME READY STATUS RESTARTS AGE
readiness 1/1 Running 0 13s
readiness 0/1 Running 0 18s
readiness 0/1 Completed 0 43s
总结:liveness和readiness探测
- liveness和readiness是两种健康检查机制,如果不特意配置,k8s将两种探测采取相同的默认行为,即通过判断容器启动进程的返回值是否为零,来判断探测是否成功。
- 两种探测配置方法完全一样,不同之处在于探测失败后的行为:liveness探测是根据Pod重启策略操作容器,大多数是重启容器。readiness则是将容器设置为不可用,不接收Service转发的请求。
- 两种探测方法可以独立存在,也可以同时使用。用liveness判断容器是否需要重启实现自愈;用readiness判断容器是否已经准备好对外提供服务。
五、DaemonSet资源
1.特点及使用场景
特点:
它会在每一个Node节点上都会生成并且只能生产一个Pod资源。
使用场景:
如果必须将Pod运行在固定的某个或某几个接地那,且要优先于其他的Pod启动。通常情况下,默认每一个节点都会运行,并且只能运行一个Pod。这种情况下推荐使用DS资源对象。
2例:
运行一个web服务,在每一个节点都运行一个Pod。
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: test-ds
spec:
template:
metadata:
labels:
name: test-ds
spec:
containers:
- name: test-ds
image: httpd
六、Job资源对象
服务类的Pod容器:RC、RS、DS、Deployment。(Pod内运行的服务,要持续运行)
工作类的Pod容器:Job。执行一次,或者批量执行处理程序,完成后退出容器。
1.提高Job的执行效率
parallelism:表示同时运行多少个Pod执行任务。
completions:表示总共需要完成Pod的数量。
kiind: Job
apiVersion: batch/v1
metadata:
name: test-job
spec:
parallelism: 2
completions: 8
template:
metadata:
name: test-job
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: Never
2.定时执行Job
kind: CronJob
apiVersion: batch/v1beta1
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello cronjob!"]
restartPolicy: OnFailure
每一分钟执行一次
3.添加apiVersion库
master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
在yaml文件中的command指令下添加
...
- command:
- --runtime-config=batch/v2alpha1=true
...
然后重启kubelet服务
查看api版本库
@master ~]#kubectl api-versions