在当今快速发展的云计算时代,Kubernetes(简称K8s)已经成为容器编排领域的领导者。它不仅能够帮助我们轻松管理容器化应用,还能确保集群的稳定运行和高效部署。本文将带你从K8s的入门到精通,掌握实战技巧,确保你的K8s集群稳定运行。
第一节:Kubernetes简介
Kubernetes是一个开源的容器编排平台,用于自动化计算机软件的部署、扩展和管理。它由Google设计,并于2014年捐赠给了Cloud Native Computing Foundation。Kubernetes的目标是提供一个可伸缩的、可靠的容器平台,使得容器化应用能够在不同的环境中无缝运行。
第二节:K8s集群搭建
2.1 环境准备
在搭建K8s集群之前,我们需要准备以下环境:
- 服务器:至少两台服务器,用于搭建高可用集群。
- 操作系统:建议使用CentOS 7.x或Ubuntu 18.04。
- 软件包:安装必要的软件包,如Docker、kubectl等。
2.2 安装Kubeadm、Kubelet和Kubectl
Kubeadm、Kubelet和Kubectl是Kubernetes集群部署和管理的基本工具。
# 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 安装kubeadm、kubelet和kubectl
sudo cat << EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/repomd.key
exclude=kubelet kubeadm kubectl
EOF
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 启动 kubelet 并设置开机启动
sudo systemctl start kubelet
sudo systemctl enable kubelet
2.3 部署K8s集群
# 首次部署K8s集群
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 将当前用户加入集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装Calico网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
第三节:K8s集群管理
3.1 资源管理
Kubernetes提供了丰富的资源类型,如Pod、Service、Deployment、StatefulSet、Ingress等,用于管理应用。
3.1.1 Pod
Pod是Kubernetes中最小的部署单元,它可以包含一个或多个容器。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:latest
3.1.2 Service
Service用于将Pod暴露给外部访问,它可以是ClusterIP、NodePort、LoadBalancer等类型。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
3.1.3 Deployment
Deployment用于管理Pod副本,它支持滚动更新、回滚等操作。
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:latest
ports:
- containerPort: 80
3.2 高可用集群
为了确保K8s集群的高可用性,我们可以使用kubeadm创建高可用集群。
# 创建高可用集群
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<master_ip> --control-plane-endpoint=<etcd_ip>:2379 --token <token> --upload-certs
# 将当前用户加入集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
3.3 监控与日志
Kubernetes提供了丰富的监控和日志工具,如Prometheus、Grafana、ELK等。
3.3.1 Prometheus
Prometheus是一个开源监控和警报工具,它可以通过配置抓取目标和监控指标来实现对集群的监控。
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'kubernetes-apiservers'
kubernetes_sd_configs:
- role: pod
namespaces: ['kube-system']
label selectors:
k8s-app: kubernetes-apiserver
3.3.2 Grafana
Grafana是一个开源的可视化平台,它可以与Prometheus结合使用,展示监控数据。
# grafana-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
spec:
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:7.0.3
ports:
- containerPort: 3000
volumeMounts:
- name: grafana-storage
mountPath: /var/lib/grafana
volumes:
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana-pvc
第四节:K8s集群优化
4.1 资源配额
Kubernetes允许我们为命名空间或Pod设置资源配额,以限制资源使用。
apiVersion: v1
kind: ResourceQuota
metadata:
name: resource-quota
spec:
hard:
requests.cpu: "1000m"
limits.cpu: "2000m"
memory: 200Gi
4.2 集群自动扩缩容
Kubernetes支持集群自动扩缩容,以便根据负载情况自动调整Pod数量。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
4.3 高性能存储
Kubernetes支持多种存储解决方案,如NFS、Ceph、GlusterFS等。以下是一个使用NFS存储的示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
nfs:
path: "/path/to/nfs/share"
server: "nfs-server-ip"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
第五节:K8s集群故障排除
当K8s集群出现问题时,我们可以通过以下方法进行故障排除:
- 查看集群状态:使用
kubectl get cs命令查看集群状态。 - 查看Pod状态:使用
kubectl get pods命令查看Pod状态。 - 查看日志:使用
kubectl logs <pod_name>命令查看Pod日志。 - 查看事件:使用
kubectl get events命令查看集群事件。
总结
通过本文的学习,相信你已经掌握了Kubernetes集群的搭建、管理、优化和故障排除技巧。在实际应用中,请结合具体场景,不断调整和优化你的K8s集群,使其更加稳定、高效地运行。
