Kubernetes教程:构建你的容器化平台
Kubernetes 教程:构建你的容器化平台
在当今以云为中心的世界中,容器化已成为打包、部署和管理应用程序的标准方式。Kubernetes,通常称为 K8s,已成为事实上的容器编排平台,它提供了一个强大的、可扩展的框架,用于自动化容器化应用程序的部署、扩展和管理。本教程将引导你完成使用 Kubernetes 构建自己的容器化平台的过程,涵盖从基本概念到高级部署策略的所有内容。
1. Kubernetes 简介
Kubernetes 是一个开源的容器编排系统,它可以自动部署、扩展和管理容器化应用程序。它由 Google 于 2014 年开源,此后由云原生计算基金会(CNCF)维护。Kubernetes 提供了一个平台,用于在服务器集群上运行和管理容器,并提供服务发现、负载均衡、自动扩展、自我修复和滚动更新等功能。
2. Kubernetes 的核心概念
在深入研究构建容器化平台之前,了解 Kubernetes 的核心概念至关重要:
- Pod: Pod 是 Kubernetes 中最小的可部署单元,代表一个或多个容器的单个实例。它们共享相同的网络命名空间和存储卷。
- 节点: 节点是运行 Kubernetes 的工作机器,可以是物理机也可以是虚拟机。它们托管运行容器化应用程序的 Pod。
- 集群: 集群是一组通过网络连接在一起的节点,它们协同工作以运行容器化应用程序。
- 控制平面: 控制平面是 Kubernetes 的大脑,负责管理集群的状态。它包括 API 服务器、etcd、调度器和控制器管理器等组件。
- 服务: 服务提供了一种稳定的方式来访问集群中运行的 Pod。它们充当负载均衡器,并将流量分配到 Pod 的多个副本。
- 部署: 部署定义了应用程序的所需状态,例如要运行的副本数和要使用的容器镜像。Kubernetes 确保实际状态与所需状态相匹配。
- 命名空间: 命名空间提供了一种在集群中组织资源并将其彼此隔离的方法。它们可用于分隔不同的环境(例如开发、测试和生产)或不同的团队。
3. 设置 Kubernetes 集群
有多种方法可以设置 Kubernetes 集群,包括:
- 使用托管的 Kubernetes 服务: 云提供商(如 Google Cloud Platform (GCP)、Amazon Web Services (AWS) 和 Microsoft Azure)提供了托管的 Kubernetes 服务,这些服务可以处理集群设置和管理的复杂性。例如,GCP 的 Google Kubernetes Engine (GKE)、AWS 的 Amazon Elastic Kubernetes Service (EKS) 和 Azure 的 Azure Kubernetes Service (AKS)。
- 使用 Kubernetes 安装工具: 诸如
kubeadm
、kops
和kubespray
之类的工具可以自动完成在裸机服务器或虚拟机上设置 Kubernetes 集群的过程。 - 从头开始手动安装: 对于更高级的用户,可以从头开始手动安装 Kubernetes,这可以更好地控制集群的配置。
对于本教程,我们将重点介绍使用 kubeadm
在一组虚拟机上设置一个简单的单控制平面集群。
3.1 先决条件
- 多台至少具有 2GB RAM 和 2 个 CPU 的机器(一台用于控制平面,其余用于工作节点)。
- 在所有机器上安装了受支持的 Linux 发行版(例如 Ubuntu、CentOS)。
- 在所有机器上安装了 Docker。
- 每台机器上的根或 sudo 访问权限。
3.2 在控制平面节点上安装 kubeadm
、kubelet
和 kubectl
bash
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3.3 初始化控制平面
bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
此命令将初始化控制平面并将必要的组件安装到控制平面节点上。--pod-network-cidr
标志指定 Pod 的网络范围。我们将使用 Flannel 作为我们的 Pod 网络插件。
初始化完成后,你将看到类似如下的输出:
```
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join
```
按照说明配置 kubectl
:
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.4 安装 Pod 网络插件
我们将使用 Flannel 作为我们的 Pod 网络插件。要安装它,请运行以下命令:
bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
3.5 将工作节点加入集群
在每个工作节点上,运行在控制平面初始化期间提供的 kubeadm join
命令。例如:
bash
sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
3.6 验证集群
工作节点加入集群后,你可以通过在控制平面节点上运行以下命令来验证集群的状态:
bash
kubectl get nodes
你应该会看到所有节点都处于 Ready
状态。
4. 部署应用程序
现在你的 Kubernetes 集群已启动并运行,你可以开始部署应用程序了。在本节中,我们将部署一个简单的 Nginx Web 服务器。
4.1 创建一个 Nginx 部署
创建一个名为 nginx-deployment.yaml
的文件,内容如下:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
此 YAML 文件定义了一个名为 nginx-deployment
的部署,该部署创建了 Nginx Web 服务器的三个副本。它指定使用 nginx:latest
容器镜像并在容器端口 80 上公开它。
要创建部署,请运行以下命令:
bash
kubectl apply -f nginx-deployment.yaml
4.2 创建一个 Nginx 服务
为了从集群外部访问 Nginx 应用程序,我们需要创建一个服务。创建一个名为 nginx-service.yaml
的文件,内容如下:
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
此 YAML 文件定义了一个名为 nginx-service
的服务,该服务将流量负载均衡到带有标签 app: nginx
的 Pod。它指定使用 TCP 协议并在端口 80 上公开服务。type: LoadBalancer
字段指定应使用云提供商的负载均衡器来公开服务(如果可用)。
要创建服务,请运行以下命令:
bash
kubectl apply -f nginx-service.yaml
4.3 访问应用程序
要获取服务的外部 IP 地址,请运行以下命令:
bash
kubectl get service nginx-service
你应该会看到类似如下的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service LoadBalancer 10.100.200.10 <external-ip> 80:32487/TCP 1m
EXTERNAL-IP
列将显示服务的外部 IP 地址。如果外部 IP 处于挂起状态,则可能需要几分钟时间才能分配它。
获取外部 IP 地址后,你可以在 Web 浏览器中访问它以查看 Nginx 默认页面。
5. 扩展应用程序
Kubernetes 可以轻松地通过增加或减少副本的数量来扩展应用程序。要将 Nginx 部署扩展到五个副本,请运行以下命令:
bash
kubectl scale deployment nginx-deployment --replicas=5
Kubernetes 将创建另外两个 Nginx Pod 以匹配所需的副本数。你可以通过运行以下命令来验证这一点:
bash
kubectl get pods
你应该会看到五个 Nginx Pod 正在运行。
6. 执行滚动更新
Kubernetes 允许你执行滚动更新,这使你可以在不造成停机的情况下更新应用程序。要将 Nginx 部署更新到新版本的 Nginx 镜像 (例如 nginx:1.19.10
),请运行以下命令:
bash
kubectl set image deployment nginx-deployment nginx=nginx:1.19.10
Kubernetes 将开始一次创建一个新 Pod,并更新后的镜像,同时一次终止一个旧 Pod。这可确保在更新过程中始终有一些副本可用。你可以通过运行以下命令来监视滚动更新的状态:
bash
kubectl rollout status deployment nginx-deployment
更新完成后,你将拥有所有使用新镜像运行的 Nginx Pod。
7. 高级主题
本教程介绍了使用 Kubernetes 构建容器化平台的基础知识。但是,还有许多高级主题值得探索,包括:
- 配置管理: 使用 ConfigMap 和 Secret 管理应用程序配置和敏感数据。
- 存储: 使用 PersistentVolume 和 PersistentVolumeClaim 为容器化应用程序提供持久存储。
- 网络: 使用不同的网络插件(如 Calico、Weave Net)配置高级网络策略。
- 监控和日志记录: 集成 Prometheus 和 Grafana 等工具以进行监控,集成 Fluentd 和 Elasticsearch 以进行日志记录。
- 安全性: 使用 Pod 安全策略、网络策略和 RBAC 实现安全最佳实践。
- 服务网格: 使用 Istio 或 Linkerd 等服务网格来管理微服务之间的通信。
- 无服务器: 使用 Knative 等平台在 Kubernetes 上部署无服务器功能。
8. 结论
Kubernetes 是一个功能强大的平台,用于构建和管理容器化应用程序。通过遵循本教程,你已经了解了 Kubernetes 的核心概念、如何设置集群、部署和扩展应用程序以及执行滚动更新。随着你继续探索 Kubernetes 的高级功能,你将能够构建一个强大且可扩展的容器化平台,该平台可以满足你最苛刻的应用程序的需求。
请记住,这只是一个开始。Kubernetes 是一个庞大而复杂的系统,还有很多东西需要学习。但是,通过本教程提供的基础知识,你已为深入研究 Kubernetes 的世界并构建自己的容器化平台做好了充分的准备。