一、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

部署有状态应用
特点:有启动顺序
对启动顺序无要求的应用就是无状态应用
对启动顺序有要求的就是有状态应用

Logo

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

更多推荐