目录
2.2 安装 Kubeadm、Kubelet 和 Kubectl
5.1 安装 Prometheus 和 Grafana 进行监控
引言
在当今的云计算和容器化技术领域,Kubernetes(简称 K8S)无疑是一颗耀眼的明星。它作为一个开源的容器编排平台,能够自动化地部署、扩展和管理容器化应用程序,极大地提高了应用的部署效率和可维护性。本文将为你提供一份全面的 K8S 使用手册,涵盖从基础概念到实际操作的各个方面,同时包含大量的代码示例和命令,帮助你更好地掌握 K8S 的运维技巧。
一、K8S 基础概念
1.1 什么是 K8S
Kubernetes 是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。它提供了强大的容器编排能力,能够帮助开发者更高效地管理大规模的容器集群。
1.2 核心组件
- API Server:作为 K8S 集群的核心枢纽,负责处理所有的 RESTful 请求,提供集群的管理接口。
- etcd:分布式键值存储系统,用于存储 K8S 集群的所有配置信息和状态数据。
- Controller Manager:负责管理集群中的各种控制器,如节点控制器、副本控制器等,确保集群状态符合预期。
- Scheduler:负责将 Pod 调度到合适的节点上运行。
- Kubelet:运行在每个节点上的代理,负责管理该节点上的 Pod 和容器。
- Kube - proxy:负责实现 K8S 服务的网络代理和负载均衡。
1.3 重要对象
- Pod:K8S 中最小的可部署单元,一个 Pod 可以包含一个或多个紧密相关的容器。
- Deployment:用于定义 Pod 的副本数量和更新策略,实现应用的部署和滚动升级。
- Service:为一组 Pod 提供统一的网络访问入口,实现负载均衡和服务发现。
- Namespace:用于隔离不同的资源,将集群划分为多个虚拟空间。
二、K8S 环境搭建
2.1 准备工作
在搭建 K8S 环境之前,需要准备以下工作:
- 至少 3 台服务器或虚拟机,建议使用 Linux 系统(如 CentOS 7)。
- 确保各节点之间网络连通,并且可以访问外网。
- 安装 Docker 容器运行时。
2.2 安装 Kubeadm、Kubelet 和 Kubectl
在所有节点上执行以下命令安装 Kubeadm、Kubelet 和 Kubectl:
# 添加 K8S 软件源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# 设置 SELinux 为 permissive 模式
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 安装 Kubeadm、Kubelet 和 Kubectl
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 启动并设置 Kubelet 开机自启
sudo systemctl enable --now kubelet
2.3 初始化 Master 节点
在 Master 节点上执行以下命令初始化集群:
# 初始化 Master 节点
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件(以 Flannel 为例)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2.4 加入 Worker 节点
在 Worker 节点上执行以下命令加入集群:
# 在 Master 节点初始化完成后会输出以下类似命令,复制到 Worker 节点执行
sudo kubeadm join <master - ip>:<master - port> --token <token> --discovery - token - ca - cert - hash <hash>
三、K8S 基本操作
3.1 创建和管理 Pod
3.1.1 创建 Pod
创建一个名为 nginx - pod.yaml
的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx - pod
spec:
containers:
- name: nginx - container
image: nginx:1.14.2
ports:
- containerPort: 80
执行以下命令创建 Pod:
kubectl apply -f nginx - pod.yaml
3.1.2 查看 Pod 状态
收起
bash
kubectl get pods
3.1.3 删除 Pod
kubectl delete pod nginx - pod
3.2 创建和管理 Deployment
3.2.1 创建 Deployment
创建一个名为 nginx - deployment.yaml
的文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx - deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx - container
image: nginx:1.14.2
ports:
- containerPort: 80
执行以下命令创建 Deployment:
kubectl apply -f nginx - deployment.yaml
3.2.2 查看 Deployment 状态
kubectl get deployments
3.2.3 扩展 Deployment
kubectl scale deployment nginx - deployment --replicas = 5
3.2.4 删除 Deployment
kubectl delete deployment nginx - deployment
3.3 创建和管理 Service
3.3.1 创建 Service
创建一个名为 nginx - service.yaml
的文件,内容如下:
apiVersion: v1
kind: Service
metadata:
name: nginx - service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
执行以下命令创建 Service:
kubectl apply -f nginx - service.yaml
3.3.2 查看 Service 状态
kubectl get services
3.3.3 删除 Service
kubectl delete service nginx - service
四、K8S 高级操作
4.1 滚动升级
4.1.1 准备新的镜像
假设要将 nginx
镜像从 1.14.2
升级到 1.16.1
。
4.1.2 更新 Deployment
kubectl set image deployment/nginx - deployment nginx - container = nginx:1.16.1
4.1.3 查看升级状态
kubectl rollout status deployment/nginx - deployment
4.2 回滚升级
kubectl rollout undo deployment/nginx - deployment
4.3 配置管理
4.3.1 创建 ConfigMap
创建一个名为 config - map.yaml
的文件,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: my - config - map
data:
config.properties: |
key1 = value1
key2 = value2
执行以下命令创建 ConfigMap:
kubectl apply -f config - map.yaml
4.3.2 在 Pod 中使用 ConfigMap
修改 nginx - pod.yaml
文件,添加 ConfigMap 挂载:
apiVersion: v1
kind: Pod
metadata:
name: nginx - pod
spec:
containers:
- name: nginx - container
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- name: config - volume
mountPath: /etc/config
volumes:
- name: config - volume
configMap:
name: my - config - map
重新创建 Pod 使配置生效:
kubectl apply -f nginx - pod.yaml
五、K8S 监控与日志
5.1 安装 Prometheus 和 Grafana 进行监控
5.1.1 使用 Helm 安装 Prometheus
# 添加 Prometheus 仓库
helm repo add prometheus - community https://prometheus - community.github.io/helm - charts
# 安装 Prometheus
helm install prometheus prometheus - community/kube - prometheus - stack
5.1.2 安装 Grafana
# 添加 Grafana 仓库
helm repo add grafana https://grafana.github.io/helm - charts
# 安装 Grafana
helm install grafana grafana/grafana
5.2 查看容器日志
kubectl logs <pod - name>
六、K8S 安全管理
6.1 网络策略
创建一个名为 network - policy.yaml
的文件,内容如下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: nginx - network - policy
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
执行以下命令创建网络策略:
kubectl apply -f network - policy.yaml
6.2 RBAC(基于角色的访问控制)
创建一个名为 rbac - role.yaml
的文件,内容如下:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod - reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
创建 RoleBinding 将角色绑定到用户或组:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read - pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod - reader
apiGroup: rbac.authorization.k8s.io
执行以下命令创建 Role 和 RoleBinding:
kubectl apply -f rbac - role.yaml
kubectl apply -f rbac - role - binding.yaml
七、总结
Kubernetes 作为一个强大的容器编排平台,为我们提供了丰富的功能和工具来管理容器化应用程序。通过本文的介绍,你应该对 K8S 的基础概念、环境搭建、基本操作、高级操作、监控日志以及安全管理等方面有了全面的了解。在实际运维过程中,要不断学习和实践,结合具体的业务场景,充分发挥 K8S 的优势,提高应用的部署效率和可靠性。同时,要密切关注 K8S 的最新版本和特性,及时进行升级和优化,以应对不断变化的业务需求。