k8s的名称空间、标签、deployment、控制器、弹性伸缩
一、k8s中的名称空间k8s中名称空间是用来隔离集群资源,而k8s中的资源也分为名称空间级资源以及集群级资源。kubectl是k8s客户端,它跟k8s没有任何关系。kubectl get [资源名称] 获取集群资源的命令#获取名称空间[root@k8s-m-01 ~]# kubectl get namespaceNAMESTATUSAGEdefaultActive5d16hkube-node-le
一、k8s中的名称空间
k8s中名称空间是用来隔离集群资源,而k8s中的资源也分为名称空间级资源以及集群级资源。命名空间是集群级资源
能够被命名空间所隔离的资源叫命名空间级资源
不被被命名空间所隔离的资源叫命名集群级资源
kubectl是k8s客户端,它跟k8s没有任何关系。
kubectl get [资源名称] 获取集群资源的命令
#获取名称空间
[root@k8s-m-01 ~]# kubectl get namespace
NAME STATUS AGE
default Active 5d16h
kube-node-lease Active 5d16h
kube-public Active 5d16h
kube-system Active 5d16h
[root@k8s-m-01 ~]# kubectl get ns
NAME STATUS AGE
default Active 5d16h
kube-node-lease Active 5d16h
kube-public Active 5d16h
kube-system Active 5d16h
# 直接用命令创建
[root@k8s-m-01 ~]# kubectl create namespace wordpress
namespace/wordpress created
二、标签
一个 Label 是一个 key=value 的键值对,其中 key 与 vaue 由用户自己指定(自定义)。Label 可以附加到各种资源对象上,例如 Node、Pod、Service、RC 等,一个资源对象可以 定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上去,Label 通常在资源对象定义时 确定,也可以在对象创建后动态添加或者删除。
我们可以通过指定的资源对象捆绑一个或多个不同的 Label 来实现多维度的资源分组管理功能,以便于灵 活、方便地进行资源分配、调度、配置、部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监 控和分析应用(日志记录、监控、告警)等。一些常用等 label 示例如下
版本标签:"release" : "stable" , "release" : "canary"
环境标签:"environment" : "dev" , "environment" : "production"
架构标签:"tier" : "frontend" , "tier" : "backend" , "tier" : "middleware"
分区标签:"partition" : "customerA" , "partition" : "customerB"
质量管控标签:"track" : "daily" , "track" : "weekly
k8s当中的标签是用来管理(识别)一系列容器,方便于管理和监控拥有同一标签的所有容器
# docker中的TAG = 仓库URL/名称空间/仓库名称:版本号
apiVersion: v1
kind: Pod
metadata:
name: test-tag
labels:
release: stable
spec:
containers:
- name: nginx
image: nginx
# 查看label
[root@k8s-m-01 ~]# kubectl get pod --show-labels
# 增加标签
kubectl label pod(资源类型) test-tag app=tag
[root@k8s-m-01 ~]# kubectl label pod test-tag app=tag
pod/test-tag labeled
[root@k8s-m-01 ~]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test-tag 0/1 ImagePullBackOff 0 2m15s app=tag,release=stable
# 删除标签
[root@k8s-m-01 ~]# kubectl label pod test-tag app-
pod/test-tag labeled
#通过标签筛选pods
kubectl get pods -l app=pod
kubectl get pods -L app
# 修改标签
## 先删除后增加
kubectl label pod(资源类型)test app=tag-
kubectl label pod(资源类型) test app=test
k8s中标签的命名规范
1、必须小写
2、必须以字母开头
3、名称当中只能够包含字母、数字和中划线(-)
k8s中常用的命令
# 获取资源
kubectl get [资源名称]
# 创建资源
kubectl apply [资源类型] [资源名称]
kubectl apply -f [资源清单的路径]
三、控制器
知识储备
无状态与有状态
所谓无状态:没有固定节点,没有固定顺序,没有固定名称,并行产生
所谓有状态:有顺序,只有一个容器启动起来,下一个容器才会启动,名字可有序,串行产生
那么在k8s中,在2种工作负载的调度有何异同?
【相同】
均以container以落地形式
均支持增加replica(副本)横向扩展
均支持挂载存储
【不同】
无状态:
副本无序随机命名,销毁后重新生成命名
并行扩容,并行缩容
有状态:
副本以0,1,2有序命名,销毁后名称不变,可通过访问副本名保持访问。
串行有序扩容,顺序为0,1,2。 串行有序缩容,顺序反之。
示例一:deployment部署nginx
示例二:statefulSet部署数据库
k8s中控制器分为:deployment、DaemonSet、StatufluSet、
控制器是用来做什么的?
- 管理Pod
3.1deployment
Deploymnet在Deployment对象中描述所需的状态,然后Deployment控制器将实际状态以受控的速率更改为所需的状态
Deployment:一般用来部署长期运行的、无状态的应用
特点:集群之中,随机部署
deployment主要功能是保证有足够的pod正常对外提供服务
#编辑deployment配置文件
[root@m01 ~]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 1
#标签选择器
selector:
matchLabels:
release: stable
template:
metadata:
labels:
release: stable
spec:
containers:
- name: nginx
image: nginx
#运行
[root@m01 ~]# kubectl apply -f deployment.yaml
deployment.apps/deployment created
#查看正在运行的容器
[root@m01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deployment-5849786498-jfqrn 1/1 Running 0 3m35s
test 1/1 Running 0 48m
#查看deployment
[root@m01 ~]# kubectl get deployment.apps
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 1/1 1 1 4m18s
#删除deployment
[root@m01 ~]# kubectl delete pod deployment-5849786498-jfqrn
pod "deployment-5849786498-jfqrn" deleted
#过会儿在查看发现系统会自动运行一个deployment
[root@m01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deployment-5849786498-hlb2c 1/1 Running 0 6m21s
test 1/1 Running 0 59m
弹性扩容(缩容)
方式1、编辑资源
[root@k8s-m-01 ~]# kubectl edit deployments deployment
修改replicas:后的数量
deployment.apps/deployment edited
方式2、打标签
#若replicas小于当前容器数,缩容,反之扩容。
[root@k8s-m-01 ~]# kubectl patch deployments.apps deployment -p ‘{“spec”:{“replicas”:40}}’
方式3、scale(设置副本数)
#replicas小于当前容器数,缩容,反之扩容。
[root@k8s-m-01 ~]# kubectl scale deployment/deployment --replicas=4
更新
kubernetes的更新采用的是滚动更新,保证服务不宕机
滚动更新:先生成新的pod,新pod启动完毕,在删除旧的pod
更新有四种形式:
一:修改配置清单
二:以标签的格式更新
三:设置镜像
四:编辑资源
1、更新配置清单
vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: django
spec:
replicas: 1
selector:
matchLabels:
app: stable
template:
metadata:
labels:
app: stable
spec:
containers:
- name: nginx2
image: nginx:1.17.10
2、标签的形式更新
1、打标签
[root@k8s-m-01 ~]# kubectl patch deployments.apps nginx -p '{"spec":{"template":{"spec":{"containers":[{"image":"nginx:1.18.0", "name":"nginx"}]}}}}'
2、修改配置清单
vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: django
spec:
replicas: 1
selector:
matchLabels:
app: stable
template:
metadata:
labels:
app: stable
spec:
containers:
- name: nginx2
image: nginx:1.19.10
3、设置镜像
语法:kubectl set image [资源类型]/资源名称 镜像名称=镜像版本
例:
[root@k8s-m-01 ~]# kubectl set image deployment/nginx nginx=nginx:1.16.0
deployment.apps/django image updated
4、edit
kubectl edit [资源类型] [资源名称]
然后修改对应的template即可
若遇到更新失败可以采用应用回滚,将版本回滚回来
回滚
回滚是为了防止人为误操作后的一种容器保护机制,回滚又有两种方式:回滚到上一个版本,回滚到指定版本
查看更新的版本
[root@k8s-m-01 ~]#kubectl rollout history deployment nginx(资源名称)
#回滚到上一个版本
[root@k8s-m-01 ~]# kubectl rollout undo deployment nginx
deployment.apps/django rolled back
#回滚到指定版本
[root@k8s-m-01 ~]# kubectl rollout undo deployment django --to-revision=1
deployment.apps/django rolled back
k8s的自愈机制
#运行以下命令查看容器正在那台机器上运行
[root@m01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test 1/1 Running 0 2m38s 10.244.2.11 n2 <none> <none>
#到正在运行容器的机器上,执行以下命令
#查看目前机器上有哪些容器在运行
[root@n2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61fb26fab7bd nginx "/docker-entrypoint.…" 14 minutes ago Up 14 minutes k8s_nginx_test_default_d5c1958a-6aa2-4451-9491-4a93fdcda8f6_0
#删除一个容器
[root@n2 ~]# docker rm -f 61fb26fab7bd
61fb26fab7bd
#过十几秒在查看,发现容器又被k8s自动运行起来
[root@n2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
295b8bf7acc5 nginx "/docker-entrypoint.…" 41 seconds ago Up 39 seconds k8s_nginx_test_default_d5c1958a-6aa2-4451-9491-4a93fdcda8f6_0
3.2DaemonSet
在集群中所有几点上只部署一个(不支持弹性扩容)
每一个节点上部署一个Pod,删除节点自动删除对应的POD
特点:每一台机器上有且只有一个
# 在集群中所有的节点上部署只部署一个Pod
#编辑配置文件
[root@m01 ~]# vim zabbix-agent.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: zabbix-agent
spec:
selector:
matchLabels:
app: zabbix-agent
template:
metadata:
labels:
app: zabbix-agent
spec:
containers:
- name: zabbix-agent
image: zabbix/zabbix-agent:5.2.6-centos
#部署
[root@m01 ~]# kubectl apply -f zabbix-agent.yaml
# 更新
1、修改配置文件
[root@k8s-m-01 ~]# kubectl edit daemonsets.apps zabbix-agent
daemonset.apps/zabbix-agent edited
2、打标签的方式
[root@k8s-m-01 ~]# kubectl patch daemonsets.apps zabbix-agent -p '{"spec":{"template":{"spec":{"containers":[{"image":"zabbix/zabbix-agent:centos-5.2.4", "name":"zabbix-agent"}]}}}}'
daemonset.apps/zabbix-agent patched
3、设置镜像
[root@k8s-m-01 ~]# kubectl set image daemonset/zabbix-agent zabbix-agent=zabbix/zabbix-agent:centos-5.2.3
daemonset.apps/zabbix-agent image updated
# 回滚
## 回滚到上一个版本
[root@k8s-m-01 ~]# kubectl rollout undo daemonset zabbix-agent
daemonset.apps/zabbix-agent rolled back
## 回滚到指定版本
[root@k8s-m-01 ~]# kubectl rollout undo daemonset zabbix-agent --to-revision=1
daemonset.apps/zabbix-agent rolled back
StatefluSet
部署有状态应用
特点:有启动顺序
对启动顺序无要求的应用就是无状态应用
对启动顺序有要求的就是有状态应用
更多推荐
所有评论(0)