K8S架构师大纲
以下是完整的Kubernetes架构师课程教学大纲,包括实验和参考资料:
一.Kubernetes技术介绍
1.Kubernetes 简介和历史
Kubernetes(简称 K8s)是一个开源的容器编排管理平台,用于自动化部署、扩展和管理容器化应用程序。它最初由 Google 设计和开发,并于2014年发布,目的是帮助开发人员和运维人员更轻松地部署、管理和扩展应用程序。Kubernetes 基于 Docker 技术,可以支持多种容器运行时,并提供了丰富的 API 和工具集,使得在 Kubernetes 上开发、部署和管理容器化应用程序变得更加简单和高效。
2.Kubernetes 优点和适用场景
Kubernetes 具有以下优点:
- 自动化管理:Kubernetes 可以自动化地管理容器化应用程序的部署、扩展、升级、恢复和监视等操作,从而减少了人工干预和管理的成本和风险。
- 可移植性:Kubernetes 支持多种容器运行时,并提供了统一的 API 和工具集,使得在不同的云平台和本地环境中部署和管理应用程序变得更加容易和便捷。
- 可扩展性:Kubernetes 支持水平扩展和垂直扩展,可以根据应用程序的负载和需求动态地调整资源的分配和使用。
- 高可用性:Kubernetes 支持容器的自动恢复和故障转移,可以确保应用程序的高可用性和稳定性。
Kubernetes 适用于以下场景:
-
微服务架构:Kubernetes 可以支持多个微服务的部署和管理,从而使得应用程序更加易于拆分、扩展和维护。
-
多云环境:Kubernetes 可以在多个云平台和本地环境中运行,使得应用程序更加容易实现云原生架构和跨云部署。
-
大规模应用:Kubernetes 可以支持大规模应用程序的部署和管理,从而提高应用程序的可靠性和性能。
3.Kubernetes 组件介绍
Kubernetes 由以下几个核心组件组成:
- API Server:提供 Kubernetes API,用于管理和操作 Kubernetes 中的资源对象。
- Etcd:Kubernetes 集群的数据存储和分发系统,用于存储集群的状态和配置信息。
- Scheduler:根据资源的需求和可用性,自动地将 Pod 调度到合适的节点上。
- Controller Manager:负责运行和管理 Kubernetes 中的控制器,如 Replication
Controller、Namespace Controller 等。 - Kubelet:在每个节点上运行,用于管理和控制节点上的 Pod。
- Container Runtime:用于运行容器的运行时,如 Docker、rkt 等。
- Service:抽象和封装了一组 Pod,为应用程序提供稳定的服务 IP 和 DNS 名称。
- Volume:提供了容器级别的持久化存储,可以将数据存储在节点上的本地磁盘、网络磁盘或云存储中。
-
4.实验:使用 Minikube 安装 Kubernetes 集群
基于minikube快速搭建kubernetes单节点环境
官方文档:https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/
安装minikube和kubectl以及依赖工具
从 Minikube 的架构中可以看出 master 节点与其它节点合为一体,而整体则通过宿主机上的 kubectl 进行管理,这样可以更加 节省资源。
1.安装docker
小脚本一键安装yum源,docker,配置镜像加速,安装docker-compose。
#安装yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all &&yum makecache && yum -y install lrzsz
#安装docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine && yum install -y yum-utils && sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum makecache fast && yum install docker-ce docker-ce-cli containerd.io
#配置镜像加速
sudo mkdir -p /etc/docker && sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lmsabin0.mirror.aliyuncs.com"],
"registry-mirrors":["https://reg-mirror.qiniu.com/"]
}
EOF
#启动docker
sudo systemctl daemon-reload && sudo systemctl start docker
#安装docker-compose并启动
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
2.下载minikube
操作 minikube 需要一个具有 root 权限的用户(非root)
并且需要将该用户添加进入 docker 用户组
创建新用户并设置密码
- useradd testuser
- passwd testuser
添加该用户至 docker 用户组:
- sudo gpasswd -a 用户名 docker
更新 docker 用户组:
- newgrp docker
切换新创建的用户来操作 minikube,我这里创建的用户为testuser
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
下载minikube的最新版本并安装到/usr/local/bin目录中。minikube是一个用于在本地运行Kubernetes的工具,是搭建Kubernetes集群的必要工具之一。
3.下载kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl`
sudo mv ./kubectl /usr/local/bin/kubectl
下载kubectl的最新版本并安装到/usr/local/bin目录中。kubectl是Kubernetes的命令行工具,用于与Kubernetes API进行交互。
参考:https://minikube.sigs.k8s.io/docs/start/
4.启动minikube
minikube start --image-mirror-country='cn' --kubernetes-version=v1.23.8
image-mirror-country 为指定使用国内源
kubernetes-version 指定部署的版本(最新版兼容性坑比较多,所以选择低版本)
查看状态
[testuser@895v7hehi4cexhft ~]$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
5.查看集群状态
可直接使用 minikube 自带的 kubectl 命令。
获取集群所有节点(机器):
minikube kubectl get nodes
获取集群所有命名空间:
minikube kubectl get namespaces
查看集群所有 Pod:
minikube kubectl – get pods -A
6.安装kubectl
由于 minikube 内置的 kubectl 命令功能不全,所以最好独立安装一个 kubectl
用以下命令下载最新发行版:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
安装 kubectl:
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
查看版本的详细信息:
kubectl version --client --output=yaml
7.部署dashboard
minikube dashboard
部署dashboard到集群中。dashboard是一个Web界面,用于方便地管理和监控Kubernetes集群中的资源。
集群外部想要直接访问 dashboard 还需要设置代理才能访问,执行以下命令:
kubectl proxy --port=8001 --address='10.0.3.170' --accept-hosts='^.*' &
--port 需要暴露的端口号
--address 服务器外网IP(宿主机IP),云服务器私网IP(非公网)
--accept-hosts 外部访问服务器的IP(白名单)云主机记得开放安全组规则允许外部访问
这样就可以在浏览器上通过以下地址访问 Kubernetes Dashboard:
http://120.39.219.10:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/persistentvolume?namespace=default
120.39.219.10:8001(云服务器服务器公网IP)
到此就能够访问dashboard资源了。但是这种方式不适合生产环境。
这种暴露方式是通过在本地启动一个 kubectl 的代理服务,将对 Kubernetes 集群的 API Server 的请求转发到本地,以方便进行调试和测试。与其他暴露方式相比,具有以下不同点:
- 基于 kubectl:这种方式是基于 kubectl 命令行工具实现的,而其他方式(如 NodePort、LoadBalancer 或Ingress 等)是通过 Kubernetes 集群中的 Service 资源对象实现的。相比其他方式,这种方式更为简单,不需要在Kubernetes 集群中创建任何资源对象,只需要在本地安装 kubectl 工具即可。
- 只能在本地访问:由于代理服务只监听在本地的端口上,因此只能在本地访问Kubernetes 集群中的资源对象,无法通过外部 IP地址或域名访问。相比其他方式(如 NodePort、LoadBalancer 或 Ingress 等),这种方式的安全性更高,不会将Kubernetes 集群中的资源对象直接暴露到外网上,但同时也限制了访问的范围。如果你的云服务器已经开启了公网 IP 并且配置了安全组规则允许外部访问,那么 kubectl proxy 命令启动的代理服务也可以被外部访问到。
- 不适用于生产环境:这种方式只适用于开发和测试环境,不适用于生产环境。在生产环境中,需要使用其他方式将 Kubernetes集群中的资源对象暴露给外部访问,如 NodePort、LoadBalancer 或 Ingress等。这些方式具有更高的可用性、可伸缩性和安全性,可以满足生产环境的需求。
综上所述,这种暴露方式相比其他方式更为简单和安全,但只适用于开发和测试环境,不适用于生产环境。在选择暴露方式时,需要根据实际需求和环境特点进行综合考虑。
查看dashboard资源
sudo kubectl get services --namespace kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.109.205.86 <none> 8000/TCP 18h
kubernetes-dashboard ClusterIP 10.109.133.78 <none> 80/TCP 18h
获取dashboard的服务地址和端口号。这个命令用于获取dashboard的访问地址,以便进入dashboard界面。
这是 Kubernetes Dashboard 和 Metrics Scraper 在集群中的 Service 资源对象信息。其中:
- Kubernetes Dashboard 是 Kubernetes 官方提供的一个 Web 界面,用于管理 Kubernetes
集群中的各种资源对象,如 Pod、Service、ReplicaSet 等。在 Kubernetes 集群中,部署了 Kubernetes
Dashboard 后,用户可以通过浏览器访问该 Web 界面,查看和管理 Kubernetes 集群中的资源对象。 - Metrics Scraper 是 Kubernetes Dashboard 中的一个组件,用于从 Kubernetes API
Server 中获取各种资源对象的监控数据,并将数据转换为 Prometheus 的格式,以方便 Prometheus 进行采集和分析。在Kubernetes 集群中,部署了 Metrics Scraper 后,Prometheus 可以从 Metrics Scraper 的Service 中获取资源对象的监控数据,进行实时监控和告警。
上面的输出中,两个资源对象都是 ClusterIP 类型的 Service,表示 Kubernetes Dashboard 和 Metrics Scraper 都是内部 Service,只在 Kubernetes 集群内部可用。其中:
- Kubernetes Dashboard 的 Service IP 地址是 10.109.133.78,它暴露了 HTTP 端口
80,用于提供 Kubernetes Dashboard 的 Web 服务。 - Metrics Scraper 的 Service IP 地址是 10.109.205.86,它暴露了 HTTP 端口 8000,用于提供Prometheus 可以访问的监控数据。
需要注意的是,上面的输出中,Service 的 external-ip 字段为 ,表示该 Service 没有指定外部 IP 地址,只能在 Kubernetes 集群内部访问。如果需要让外部可以访问该 Service,需要将其暴露为外部 Service,如 NodePort、LoadBalancer 或 Ingress 等类型的 Service。
8.使用service访问dashboard
要让外部可以访问 Kubernetes Dashboard,需要将 Kubernetes Dashboard 通过公网 IP 地址和端口号暴露出来。可以使用 NodePort 类型的 Service 将 Kubernetes Dashboard 暴露在公网 IP 地址上,然后通过浏览器访问公网 IP 地址和端口号即可。
以下是使用 NodePort 类型的 Service 暴露 Kubernetes Dashboard 的步骤:
部署 Kubernetes Dashboard。
在 Kubernetes 集群中部署 Kubernetes Dashboard,可以使用以下命令完成:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
这将在 Kubernetes 集群中创建一个名为 kubernetes-dashboard 的 Deployment 和一个名为 kubernetes-dashboard 的 Service。默认情况下,Service 的类型为 ClusterIP,只能在 Kubernetes 集群内部访问。
创建 NodePort 类型的 Service。
要将 Kubernetes Dashboard 暴露到外部,需要创建一个 NodePort 类型的 Service。可以使用以下命令创建一个名为 kubernetes-dashboard-nodeport 的 Service:
kubectl expose deployment kubernetes-dashboard --type=NodePort --name=kubernetes-dashboard-nodeport --port=80 --target-port=8443
这将在默认命名空间中创建一个名为 kubernetes-dashboard-nodeport 的 NodePort 类型的 Service。该 Service 将 Kubernetes Dashboard 的 8443 端口映射到一个随机的端口上,可以通过该端口在浏览器中访问 Kubernetes Dashboard。
获取 Service 的 NodePort 端口号和公网 IP 地址。
使用以下命令获取 Service 的 NodePort 端口号和公网 IP 地址:
kubectl get svc kubernetes-dashboard-nodeport
该命令将显示 kubernetes-dashboard-nodeport Service 的详细信息,包括其 NodePort 端口号和公网 IP 地址。
在浏览器中访问 Kubernetes Dashboard。
使用浏览器打开以下 URL,将其替换为 Kubernetes Dashboard 的公网 IP 地址和 NodePort 端口号:
https://<公网 IP 地址>:<NodePort 端口号>
这将打开 Kubernetes Dashboard 的登录页面,在该页面中输入相应的账号和密码,即可登录并访问 Kubernetes Dashboard。
需要注意的是,使用 NodePort 类型的 Service 暴露 Kubernetes Dashboard 可能存在安全风险,因为这会将 Kubernetes Dashboard 直接暴露到集群外部。在生产环境中,建议使用更加安全和专业的 Ingress 控制器来暴露 Kubernetes Dashboard。同时还要注意保护 Kubernetes Dashboard 的访问权限,只允许授权的用户或者 IP 地址访问。
这样,就可以使用公网IP地址访问Kubernetes集群中的Dashboard了。需要注意的是,在使用NodePort暴露Service可能会存在一些安全风险。因此,在使用NodePort时,请务必做好安全设置。一种更安全的方法是使用LoadBalancer类型的Service,这种类型的Service可以使用云平台提供的负载均衡器,而不需要直接暴露NodePort端口。
参考资料:
Kubernetes 官方文档(https://kubernetes.io/docs/home/)
《Kubernetes in Action》一书(作者:Marko Luksa)
Minikube 官方文档(https://minikube.sigs.k8s.io/docs/start/)
Kubernetes基础操作
二.使用 kubectl 命令行工具
部署应用程序
1.管理 Pod 和容器
在Kubernetes上,可以使用kubectl命令行工具来管理Pod和容器。以下是一些常用的kubectl命令:
kubectl get pods:获取集群中所有Pod的状态信息。
kubectl describe pod (pod-name):获取指定Pod的详细信息。
kubectl logs (pod-name):获取指定Pod的日志信息。
kubectl exec -it (pod-name) /bin/bash:进入指定Pod的容器内部的bash shell。
kubectl delete pod (pod-name):删除指定Pod。
此外,还可以使用YAML文件来定义Pod和容器的配置。可以使用kubectl apply -f 命令来应用这些配置文件。例如:
# my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: ubuntu:latest
command: ["sleep", "3600"]
应用配置文件
kubectl apply -f my-pod.yaml
这个配置文件定义了一个名为my-pod的Pod,其中包含一个名为my-container的容器,使用ubuntu:latest镜像,并运行sleep命令。使用kubectl apply -f命令将这个配置文件应用到Kubernetes集群中,即可创建相应的Pod和容器。
2.缩放应用程序
- 水平扩展:
在Kubernetes上,可以通过水平扩展来缩放应用程序。水平扩展可以根据应用程序的负载自动增加或减少Pod的数量,以满足应用程序的需求。
可以使用kubectl scale命令来进行水平扩展。例如,要将一个名为my-deployment的Deployment的Pod数量扩展到3个,可以使用以下命令:
kubectl scale deployment my-deployment --replicas=3
这个命令将my-deployment的Pod数量扩展到3个。如果要缩减Pod数量,可以将–replicas选项的值设置为更小的值。
- 动态调整:
此外,还可以使用自动扩展来根据应用程序的负载动态地调整Pod数量。可以使用Horizontal Pod Autoscaler(HPA)来配置自动扩展。HPA会监控Deployment或Replication Controller的CPU利用率或其他自定义指标,并根据配置的规则来自动扩展或缩减Pod数量。
当应用程序的负载增加时,可以使用HPA自动扩展Kubernetes Pod的数量。以下是一个使用HPA自动扩展的示例实验:
a.创建一个Deployment
在Kubernetes中,Deployment是一种控制器,用于管理Pod的副本数量和更新策略。首先,我们需要创建一个Deployment,例如:
kubectl create deployment php-apache --image=k8s.gcr.io/hpa-example
这个命令将创建一个名为php-apache的Deployment,使用k8s.gcr.io/hpa-example镜像。
b.创建一个Service
在Kubernetes中,Service用于暴露Pod的网络端口。如果要从外部访问Pod,需要创建一个Service。例如:
kubectl expose deployment php-apache --port=80 --target-port=80 --type=NodePort
这个命令将创建一个名为php-apache的Service,将本地端口80映射到Pod的端口80上。
c.创建一个HPA
下面我们将创建一个HPA,用于自动扩展Pod的数量。可以使用以下命令创建一个名为php-apache-hpa的HPA:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
这个命令将创建一个HPA,根据CPU利用率自动调整Pod的数量。如果CPU利用率超过50%,HPA将自动扩展Pod的数量,但不会超过10个。最小Pod数量为1。
d.测试自动扩展
现在,我们可以模拟应用程序负载来测试自动扩展功能。可以使用以下命令启动一个负载测试:
kubectl run -i --tty load-generator --image=busybox /bin/sh
然后,在控制台中使用以下命令模拟负载:
while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
这个命令会不断地从Service中访问Pod,模拟负载。
e.监视自动扩展
可以使用以下命令来监视自动扩展的情况:
kubectl get hpa
kubectl describe hpa php-apache-hpa
第一个命令将显示HPA的概览信息,包括目标Deployment、CPU利用率和当前Pod数量等信息。第二个命令将显示详细的HPA配置信息,包括扩展和缩减Pod数量的阈值等信息。
当负载增加时,HPA将自动扩展Pod的数量,直到达到最大Pod数量。在本实验中,最大Pod数量为10。当负载减少时,HPA将自动缩减Pod的数量,直到达到最小Pod数量。在本实验中,最小Pod数量为1。
以上就是一个使用HPA自动扩展Kubernetes Pod数量的示例实验。注意,HPA需要根据实际的应用程序负载进行配置,以便自动扩展和缩减Pod数量。
实验:使用 kubectl 部署应用程序、管理 Pod 和容器、缩放应用程序
参考资料:
Kubernetes 官方文档(https://kubernetes.io/docs/home/)
《Kubernetes in Action》一书(作者:Marko Luksa)
三.Kubernetes高级操作
1.使用命名空间进行资源隔离
命名空间是Kubernetes中用于进行资源隔离和权限控制的基本单元。使用命名空间可以将一个Kubernetes集群划分为多个逻辑部分,并为每个部分分配一定的资源和权限。这样可以避免不同应用程序之间的冲突和干扰,提高集群的可靠性和安全性。
在Kubernetes中,每个对象都属于一个命名空间。常见的对象包括Pod、Service、Deployment、ConfigMap、Secret等。这些对象可以通过命名空间进行隔离和管辖,以便在不同的应用程序之间进行区分和管理。
a.查看Kubernetes中的命名空间列表:
kubectl get namespaces
b.可以使用以下命令创建一个新的命名空间:
kubectl create namespace my-namespace
c.指定创建对象的命名空间
在创建其他对象时,可以使用–namespace选项指定所属的命名空间。例如,可以使用以下命令创建一个名为my-pod的Pod,并将其放置在my-namespace命名空间中:
kubectl run my-pod --image=nginx --namespace=my-namespace
在进行访问控制和资源配额时,也可以使用命名空间进行限制和管理。例如,可以为每个命名空间分配不同的资源限制和配额,以便对资源进行更细粒度的管理和控制。
2.使用标签进行资源选取
标签是Kubernetes中用于描述和选择资源的基本单元。使用标签可以为Pod、Service、Deployment等对象添加元数据,并根据这些元数据进行资源选择和筛选。这样可以方便地组织和管理资源,并提高资源的可用性和可靠性。
在Kubernetes中,每个对象都可以添加一个或多个标签。例如,可以为一个Pod添加以下标签:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: web
tier: frontend
spec:
containers:
- name: nginx
image: nginx
上述示例中,为my-pod Pod添加了两个标签:app: web和tier: frontend。这些标签提供了关于Pod的一些元数据信息,例如Pod的作用、所属的应用程序等。
在进行资源选取和筛选时,可以使用标签选择器进行匹配。例如,可以使用以下命令查找所有带有app: web标签的Pod:
kubectl get pods -l app=web
可以使用以下命令查找所有带有app: web标签和tier: frontend标签的Pod:
kubectl get pods -l app=web,tier=frontend
在进行应用程序开发和部署时,建议为每个对象添加合适的标签,并使用标签选择器进行资源选取和管理。这可以方便地进行资源的组织和管理,并提高应用程序的可用性和可靠性。
3.使用配置文件进行应用程序部署
配置文件是Kubernetes中用于描述和部署应用程序的基本单元。使用配置文件可以定义应用程序的部署、服务、存储等方面的配置信息,并将这些配置信息提交给Kubernetes API Server。Kubernetes会根据这些配置信息自动创建和管理相关的资源,从而实现应用程序的部署和运行。
Kubernetes中常见的资源对象包括Pod、Service、Deployment、ConfigMap、Secret等。其中,Deployment是一种常用的资源对象,可以用于管理Pod副本集的创建、扩容、缩容等操作,从而实现应用程序的部署和管理。以下是一个Deployment的示例配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
上述示例中,定义了一个名为my-app的Deployment,它包含3个Pod副本,使用app: web标签进行选择。每个Pod包含一个名为my-container的容器,使用nginx镜像,并监听80端口。
可以使用以下命令来创建和管理Deployment:
kubectl apply -f deployment.yaml # 创建Deployment
kubectl get deployments # 查看Deployment列表
kubectl describe deployment my-app # 查看Deployment详细信息
kubectl scale deployment my-app --replicas=5 # 扩容Deployment
kubectl delete deployment my-app # 删除Deployment
除了Deployment,还可以使用其他配置文件来定义和管理不同的Kubernetes资源对象,例如Service、ConfigMap、Secret等。在进行应用程序开发和部署时,建议使用配置文件进行资源的定义和部署,并进行版本控制和追踪,以便实现应用程序的可靠和可持续的运行。
4.使用控制器进行应用程序管理
控制器是Kubernetes中用于实现应用程序管理的基本单元。使用控制器可以定义应用程序的期望状态和实际状态,并自动调整实际状态以符合期望状态。
在Kubernetes中,Deployment、StatefulSet、ReplicaSet等都是控制器,用于管理Pod的部署、扩容、缩容、滚动升级等操作。它们之间有一些区别和适用场景,下面分别介绍一下:
Deployment
Deployment是Kubernetes中最常用的控制器之一,用于管理Pod的副本集。Deployment可以实现应用程序的自动化部署、滚动升级、自我修复等操作。Deployment会根据指定的副本数创建Pod副本集,如果Pod副本数与指定的副本数不一致,则会自动进行调整。Deployment还支持滚动升级,即可以在不停机的情况下逐个替换Pod,以实现应用程序的无缝升级。
StatefulSet
StatefulSet是Kubernetes中用于管理有状态应用程序的控制器。与Deployment不同,StatefulSet可以为Pod分配唯一的标识符和稳定的网络标识符,以便在Pod重新调度、扩容、缩容时保持稳定。StatefulSet还支持有序部署和有序缩容,即可以保证Pod的启动和停止顺序。StatefulSet适用于管理有状态应用程序,例如数据库、消息队列等。
ReplicaSet
ReplicaSet是Kubernetes中最基本的控制器之一,它用于管理Pod副本集。ReplicaSet可以根据指定的副本数创建Pod副本集,并为Pod副本集进行自动化的调整和管理。但与Deployment不同,ReplicaSet不支持滚动升级和滚动回滚操作。通常情况下,ReplicaSet会被Deployment所替代,因为Deployment除了支持ReplicaSet的功能,还支持滚动升级、滚动回滚等高级功能。
更多控制器
DaemonSet
DaemonSet控制器用于管理在集群中运行的守护进程。DaemonSet会确保每个节点上都运行指定数量的Pod副本,用于实现集群级别的服务、监控、日志收集等功能。
Job
Job控制器用于管理运行一次性任务的Pod。Job会在指定数量的Pod完成任务后自动删除Pod。Job可以设置任务的重试次数,以保证任务的可靠性和稳定性。
CronJob
CronJob控制器用于管理定时任务。CronJob可以设置重复执行的时间间隔和任务的命令或脚本,以实现定时备份、定时清理等功能。
HorizontalPodAutoscaler
HorizontalPodAutoscaler控制器用于自动扩缩容Pod副本集。HorizontalPodAutoscaler会根据Pod副本集的CPU使用率或自定义指标,自动调整Pod副本集的数量,以适应应用程序的流量变化。
综上所述,Deployment、StatefulSet、ReplicaSet等都是控制器,它们之间有一些区别和适用场景。在进行应用程序开发和部署时,需要根据应用程序的特点和需求选择合适的控制器。同时,还需要了解控制器的高级特性,例如滚动升级、滚动回滚等,以便实现应用程序的高可用和可靠性。
具体关联:
HPA控制器:在使用HPA控制器自动扩缩容Pod副本集之前,需要先使用Deployment控制器部署一个Pod副本集。这是因为HPA控制器依赖于Deployment控制器,通过Deployment控制器来管理Pod副本集的版本控制和滚动升级。
ReplicaSet控制器:ReplicaSet控制器用于管理Pod副本集的部署和缩容。ReplicaSet控制器可以通过Deployment控制器来实现滚动升级和回滚操作。
StatefulSet控制器:StatefulSet控制器用于管理有状态应用程序的Pod副本集。StatefulSet控制器可以通过Deployment控制器来实现滚动升级和回滚操作。
DaemonSet控制器:DaemonSet控制器用于管理在集群中运行的守护进程。DaemonSet控制器可以通过Deployment控制器来实现滚动升级和回滚操作。
因此,在使用这些控制器时,也需要先使用Deployment控制器来部署Pod副本集,以确保控制器的正常运行和应用程序的高可用性和可靠性。
5.使用服务进行应用程序访问
服务是Kubernetes中用于实现应用程序访问的基本单元。使用服务可以将一组Pod封装为一个逻辑单元,并为其分配一个唯一的IP地址和DNS名称。这样可以方便地进行应用程序访问,并提高应用程序的可靠性和可用性。Kubernetes中常用的服务类型包括ClusterIP、NodePort、LoadBalancer等,它们可以根据应用程序的不同需求进行选择和使用。
1.k8s应用程序访问
在Kubernetes中,使用Service对象进行应用程序访问是一种常见的方式。以下是使用Service对象进行应用程序访问的实操:
1.创建Deployment控制器
使用Deployment控制器部署应用程序,并在Pod的配置文件中定义所需的CPU和内存资源限制。
2.创建Service配置文件
在Service的配置文件中定义应用程序的访问方式、端口号等信息。例如,以下是一个Service对象的配置文件:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
在上面的配置文件中,定义了一个名为my-service的Service对象,应用程序的端口号为80,Pod的端口号为8080。
3.创建Service
使用kubectl apply命令创建Service。监控Service的状态
使用kubectl get、describe命令查看Service的状态和详细信息,可以查看当前Service的IP地址、端口号、Pod选择器等信息。
4.访问应用程序
使用kubectl port-forward命令将Service端口号映射到本地端口号,以便在本地浏览器中访问应用程序。例如,执行以下命令ÿ