控制器资源

一、控制器

1、介绍

    k8s内拥有许多的控制器类型,用来控制pod的状态、行为、副本数量等等,控制器通过pod的标签来控制pod。
     
    Pod通过控制器实现应用的运维,如伸缩、升级等,控制器决定了创建pod资源的方式和类型,在集群上管理和运行容器的对象通过label-selector 相关联。

2、控制器常见类型

1、Deployment:一般用来部署长期运行的、无状态的应用
  特点:集群之中,随机部署
  
2、DaemonSet:每一个节点上部署一个Pod,删除节点自动删除对应的POD(zabbix-agent)
  特点:每一台上有且只有一台
  
3、StatudfluSet: 部署有状态应用
  特点:有启动顺序

3、控制器图

二、Deployment无状态控制器

k8s中所有的控制器都是用来管理Pod的。Deployment支持滚动更新、版本升级等功能。

1、创建Deployment资源

kind: Deployment
apiVersion: apps/v1
metadata:
  name: test-deployment
spec:
  selector:   # 选择Pod
    matchLabels:
      app: test-deployment
  template:   # 定义创建Pod的模板
    metadata:
      labels:
        app: test-deployment
    spec:
      containers:
        - name: nginx
          image: nginx

参数详解

test-deployment:Deployment的名称。
replicas:创建Pod的副本数。
selector:定义Deployment如何找到要管理的Pod,与template的label(标签)对应。
template字段包含以下字段:
    app:nginx使用label(标签)标记Pod
    spec:表示Pod运行一个名字为nginx的容器。
    image:运行此Pod使用的镜像
    Port:容器用于发送和接收流量的端口

1.1、执行部署命令

# 部署
[root@k8s-master-01 k8s]# kubectl apply -f deployment.yaml 
deployment.apps/test-deployment created

# 查看
[root@k8s-master-01 k8s]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-76cdbc6456-2sw99   1/1     Running   0          20s

[root@k8s-master-01 k8s]# kubectl get deployments.apps
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
test-deployment   1/1     1            1           3m11s
名字           启动Pod数量  理想状态     当前状态    时间

2、Deployment动态扩容

--replicas:指定副本数

[root@k8s-master-01 k8s]# kubectl scale deployment test-deployment --replicas=10
deployment.apps/test-deployment scaled			  控制器名称         指定副本数

[root@k8s-master-01 k8s]# kubectl get pods
NAME                               READY   STATUS              RESTARTS   AGE
test-deployment-76cdbc6456-2rf8j   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-2sw99   1/1     Running             0          7m10s
test-deployment-76cdbc6456-4gs5k   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-8fsvr   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-gr48l   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-kvqmq   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-lkg98   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-p2p2f   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-qc6nk   0/1     ContainerCreating   0          12s
test-deployment-76cdbc6456-wcngr   0/1     ContainerCreating   0          12s

3、Deployment的滚动更新

格式:
	kubectl set image [kind] [镜像名称] [容器名称] [更新版本]

[root@k8s-master-01 k8s]# kubectl set image deployment/test-deployment nginx=nginx:1.18

4、Deployment回滚

4.1、查看部署历史

[root@k8s-master-01 k8s]# kubectl rollout history deployment test-deployment
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

4.2、回滚

# 回滚到上一个版本
[root@k8s-master-01 k8s]# kubectl rollout undo deployment test-deployment 
deployment.apps/test-deployment rolled back

# 回滚到第一个版本(指定版本)
[root@k8s-master-01 k8s]# kubectl rollout undo deployment test-deployment --to-revision=1
deployment.apps/test-deployment rolled back

5、Deployment中的标签选择器

在配置清单中,匹配标签的方式有两种:matchLabels 和 matchExpressions
matchLabels			: 精确匹配
matchExpressions	: 模糊匹配	
	IN 		
	NOTIN

6、Deployment的配置项

namespace:      命名空间
labels:		   标签
annotations:	注解
replicas: 		副本数

7、将Django部署到k8s

1.创建Django代码
[root@k8s-master-01 k8s]# mkdir django
[root@k8s-master-01 k8s]# cd django/docker
[root@k8s-master-01 docker]# ll
drwxr-xr-x 3 root root 123 Jan  6 21:13 app01
-rw-r--r-- 1 root root   0 Jan  6 21:13 db.sqlite3
drwxr-xr-x 3 root root  93 Jan  6 21:13 docker
-rw-r--r-- 1 root root 647 Jan  6 21:13 manage.py


2、编写Dockerfile
[root@k8s-master-01 docker]# vim Dockerfile
FROM python:3.9
RUN pip install django==2.2.2
ADD ./ /opt/
WORKDIR /opt
EXPOSE 80
CMD python manage.py runserver 0.0.0.0:80

3.修改配置文件
[root@k8s-master-01 docker]# vim docker/settings.py 
ALLOWED_HOSTS = ['*']

4.打包镜像
[root@k8s-master-01 docker]# docker build -t meng/django:v1.1 .

5.运行
[root@k8s-master-01 docker]# docker run -d -P meng/django:v1.1

7.1 创建资源

[root@k8s-master-01 docker]# vim deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: django
spec:
  selector:
    matchLabels:
      app: django
  template:
    metadata:
      labels:
        app: django
    spec:
      containers:
        - name: django
          image: meng/django:v1.1

7.2 执行

[root@k8s-master-01 docker]# kubectl apply -f deployment.yaml 
deployment.apps/django created

# 查看pod
[root@k8s-master-01 docker]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
django-6c7dd45d46-tczwj            1/1     Running   0          107s
test-deployment-76cdbc6456-w8flv   1/1     Running   0          32m

# 查看详情
[root@k8s-master-01 docker]# kubectl describe pod django
[root@k8s-master-01 docker]# kubectl get pods -o wide

三、Service负载均衡器

作用就是为k8s中的Pod提供负载均衡服务。

1、Service实践

[root@k8s-master-01 docker]# vim deployment.yaml 

kind: Deployment
apiVersion: apps/v1
metadata:
  name: django
spec:
  selector:
    matchLabels:
      app: django
  template:
    metadata:
      labels:
        app: django
    spec:
      containers:
        - name: django
          image: alvinos/django:v1
---
kind: Service
apiVersion: v1
metadata:
  name: django
spec:
  selector:
    app: django
  ports:
    - port: 80
      targetPort: 80
      name: http

1.1、执行

# 部署
[root@k8s-master-01 docker]# kubectl apply -f deployment.yaml 

# 查看
[root@k8s-master-01 docker]# kubectl get pods
[root@k8s-master-01 docker]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
django       ClusterIP   10.110.155.174   <none>        80/TCP    8m43s
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   6d22h

# 删除
[root@k8s-master-01 docker]# kubectl delete svc django

1.2、修改镜像

[root@k8s-master-01 k8s]# kubectl set image deployment/django django=alvinos/django:v1

1.3、访问

curl 10.110.155.174/index

# 扩容
[root@k8s-master-01 docker]# kubectl scale deployment django --replicas=10

# 滚动更新
[root@k8s-master-01 docker]# kubectl set image deployment/django django=alvinos/django:v2

2、ClusterIP

只在集群内部访问。ClusterIP也是默认的Service类型。

---
kind: Service
apiVersion: v1
metadata:
  name: django
spec:
  selector:
    app: django
  ports:
    - port: 80
      targetPort: 80
      name: http
  type: ClusterIP   # 定义类型
  clusterIP: 10.96.117.231  # 可以自定义ip

3、NodePort

利用宿主主机的IP和端口,实现网络转发

---
kind: Service
apiVersion: v1
metadata:
  name: django
spec:
  selector:
    app: django
  ports:
    - port: 80
      targetPort: 80
      name: http
      nodePort: 30080  # 可以定义端口
  type: NodePort  # 定义类型
  clusterIP: 10.96.117.231  # 可以自定义ip

4、LoadBalancer

利用公网负载均衡,转发流量到k8s。

---
kind: Service
apiVersion: v1
metadata:
  name: django
spec:
  selector:
    app: django
  ports:
    - port: 80
      targetPort: 80
      name: http
      nodePort: 30080
  type: LoadBalancer
  clusterIP: 10.96.117.231

5、ExternalName

将外部的服务接入集群,使用k8s来管理外部的服务。

[root@k8s-master-01 docker]# vim ex.yaml
---
kind: Service
apiVersion: v1
metadata:
  name: externalname
spec:
  type: ExternalName
  externalName: www.baidu.com

5.1、测试

# 部署
[root@k8s-master-01 docker]# kubectl apply -f ex.yaml

# 查看
[root@k8s-master-01 docker]# kubectl get svc
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
django         LoadBalancer   10.96.117.231   <pending>       80:30080/TCP   33m
externalname   ExternalName   <none>          www.baidu.com   <none>         27s
kubernetes     ClusterIP      10.96.0.1       <none>          443/TCP  

# 测试并访问
[root@k8s-master-01 docker]# kubectl run test --rm -it --image=busybox:1.28.3If you don't see a command prompt, try pressing enter.
/ # nslookup externalname
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      externalname
Address 1: 112.80.248.75  # 浏览器访问ip
Address 2: 112.80.248.76

6、Service别名

Service别名 跟 Service IP 同样的功能。
Service别名的组成:
	service名称.命名空间.svc.cluster.local
	django.default.svc.cluster.local

四、把bbs部署到k8s中

1、数据库

---
kind: Namespace
apiVersion: v1
metadata:
  name: mysql
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: mysql
  namespace: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
          readinessProbe:
            tcpSocket:
              port: 3306
---
kind: Service
apiVersion: v1
metadata:
  name: mysql
  namespace: mysql
spec:
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql

[root@k8s-master-01 ~]# kubectl apply -f mysql.yaml
[root@k8s-master-01 ~]# kubectl exec -it -n mysql mysql-566544f8cc-8w6zz -- bash
root@mysql-566544f8cc-8w6zz:/# mysql -uroot -p123456
mysql> create database bbs CHARACTER SET utf8 COLLATE utf8_general_ci;;
Query OK, 1 row affected (0.00 sec)

2、bbs

---
kind: Namespace
apiVersion: v1
metadata:
  name: bbs
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: bbs
  namespace: bbs
spec:
  selector:
    matchLabels:
      app: bbs
  template:
    metadata:
      labels:
        app: bbs
    spec:
      containers:
        - name: bbs
          image: alvinos/django:v1.3
          readinessProbe:
            tcpSocket:
              port: 80
---
kind: Service
apiVersion: v1
metadata:
  namespace: bbs
  name: bbs
spec:
  selector:
    app: bbs
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30081
  type: NodePort

[root@k8s-master-01 k8s]# kubectl apply -f bbs.yaml 
posted @   迷恋~以成伤  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示