控制器资源
一、控制器
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?