快速部署自建Kubernetes(K8s)集群的方法包括:使用工具如kubeadm、选择合适的基础设施、准备所需的节点、配置网络插件。Kubeadm是一个官方工具,能够快速且相对简单地部署K8s集群。本文将详细描述如何使用kubeadm工具来快速部署一个自建的K8s集群。
一、准备环境
在开始部署Kubernetes之前,需要准备好部署环境。首先,需要选择合适的基础设施,这可以是物理服务器、虚拟机或云服务器。每个节点需要至少2GB的RAM和2个CPU核心。为了确保集群的稳定性,还需要配置时间同步服务(如NTP)和设置主机名。其次,需要准备操作系统,Kubernetes官方推荐使用基于Linux的操作系统,如Ubuntu、CentOS等。
选择操作系统是至关重要的一步,因为不同的操作系统可能会有不同的配置和依赖。对于本教程,我们将使用Ubuntu 20.04 LTS版本。确保所有节点的操作系统版本和配置一致,以避免在部署过程中出现不必要的问题。
二、安装基础工具
在所有节点上安装Docker和kubeadm工具。Docker是Kubernetes使用的容器运行时,而kubeadm则是用于初始化集群的工具。首先,更新系统软件包并安装Docker:
sudo apt-get update
sudo apt-get install -y docker.io
接着,添加Kubernetes的APT源,并安装kubeadm、kubelet和kubectl:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
为了确保kubelet和Docker在系统启动时自动启动,使用以下命令:
sudo systemctl enable docker
sudo systemctl enable kubelet
三、初始化主节点
在主节点上使用kubeadm初始化集群:
sudo kubeadm init --pod-network-cidr=192.168.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
四、安装网络插件
Kubernetes需要一个网络插件来管理Pod之间的通信。我们将使用Calico作为网络插件。使用以下命令来安装Calico:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
安装完成后,验证所有Pod是否都在运行状态:
kubectl get pods --all-namespaces
五、加入工作节点
在工作节点上,使用在初始化主节点时生成的命令和令牌,将它们加入集群。例如:
sudo kubeadm join <master-node-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
每个工作节点都需要执行此命令。一旦工作节点加入集群,可以使用以下命令查看节点状态:
kubectl get nodes
六、部署应用程序
一旦集群部署完成,就可以开始部署应用程序了。创建一个简单的Nginx部署作为示例:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
使用以下命令查看服务的详细信息:
kubectl get svc
你将看到一个外部IP地址和端口,可以通过它们访问Nginx应用。
七、配置持久存储
为了在集群中使用持久存储,需要配置存储类和持久卷。在Kubernetes中,存储类(StorageClass)定义了存储的类型和属性。创建一个简单的存储类:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
保存为storageclass.yaml文件并应用:
kubectl apply -f storageclass.yaml
接着,创建一个持久卷(PersistentVolume)和持久卷声明(PersistentVolumeClaim):
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc0001
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
保存为persistentvolume.yaml文件并应用:
kubectl apply -f persistentvolume.yaml
八、配置集群监控
为了监控集群的性能和资源使用情况,建议安装Prometheus和Grafana。首先,创建一个命名空间用于监控:
kubectl create namespace monitoring
接着,使用Helm安装Prometheus和Grafana:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus --namespace monitoring
helm install grafana grafana/grafana --namespace monitoring
安装完成后,可以使用以下命令获取Grafana的登录密码:
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
九、配置日志收集
为了收集和分析日志,建议使用EFK(Elasticsearch, Fluentd, Kibana)堆栈。首先,创建命名空间用于日志收集:
kubectl create namespace logging
然后,使用Helm安装Elasticsearch、Fluentd和Kibana:
helm repo add elastic https://helm.elastic.co
helm repo update
helm install elasticsearch elastic/elasticsearch --namespace logging
helm install fluentd stable/fluentd --namespace logging
helm install kibana elastic/kibana --namespace logging
安装完成后,可以通过Kibana访问和分析日志。
十、配置自动扩展
为了确保集群能够根据负载自动扩展,可以配置Horizontal Pod Autoscaler(HPA)。首先,确保Metrics Server已安装:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
接着,创建一个HPA示例:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
保存为hpa.yaml文件并应用:
kubectl apply -f hpa.yaml
这样,当CPU使用率超过50%时,HPA将自动扩展Nginx部署。
十一、配置备份和恢复
为了确保数据安全,需要配置备份和恢复机制。可以使用Velero工具来备份和恢复Kubernetes资源和持久卷。首先,安装Velero CLI:
wget https://github.com/vmware-tanzu/velero/releases/download/v1.6.3/velero-v1.6.3-linux-amd64.tar.gz
tar -xvf velero-v1.6.3-linux-amd64.tar.gz
sudo mv velero-v1.6.3-linux-amd64/velero /usr/local/bin/
接着,配置存储用于备份,并安装Velero服务器:
velero install --provider aws --bucket <your-bucket> --secret-file <your-credentials-file> --backup-location-config region=<your-region>
这样,Velero将定期备份Kubernetes资源和持久卷,并在需要时进行恢复。
十二、配置安全策略
为了确保集群的安全,需要配置网络策略和Pod安全策略。创建一个简单的网络策略示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: nginx
ports:
- protocol: TCP
port: 80
保存为networkpolicy.yaml文件并应用:
kubectl apply -f networkpolicy.yaml
创建一个Pod安全策略示例:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: MustRunAsNonRoot
fsGroup:
rule: RunAsAny
volumes:
- 'configMap'
- 'emptyDir'
- 'secret'
保存为podsecuritypolicy.yaml文件并应用:
kubectl apply -f podsecuritypolicy.yaml
十三、配置高可用性
为了确保集群的高可用性,需要配置多个主节点和etcd节点。首先,初始化第一个主节点并配置etcd集群:
sudo kubeadm init --control-plane-endpoint "<load-balancer-dns>:6443" --upload-certs --pod-network-cidr=192.168.0.0/16
接着,记录初始化命令和证书信息,并在其他主节点上执行:
sudo kubeadm join <load-balancer-dns>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> --control-plane --certificate-key <certificate-key>
这样,多个主节点将共享负载,提高集群的可用性。
十四、总结和展望
快速部署自建K8s集群涉及多个步骤,包括准备环境、安装基础工具、初始化主节点、安装网络插件、加入工作节点、部署应用程序、配置持久存储、监控、日志收集、自动扩展、备份和恢复、安全策略以及高可用性配置。通过详细的步骤和示例代码,可以快速高效地部署一个功能齐全的K8s集群。未来,可以进一步优化集群性能、提高安全性以及实现更多自动化操作。
相关问答FAQs:
如何快速部署自建k8s集群?
在现代软件开发和部署中,Kubernetes(K8s)被广泛应用于容器编排和管理。自建K8s集群能够帮助团队更好地控制和管理应用程序的生命周期。本文将为您提供详细的步骤和实践,以帮助您快速部署自建K8s集群。
1. 准备工作
在开始部署K8s集群之前,需要确保您具备以下条件:
- 硬件要求:至少需要一台主机作为K8s的控制平面节点,另外还需要至少一台工作节点。推荐使用多台虚拟机或物理机。
- 操作系统:建议使用支持的Linux发行版,如Ubuntu、CentOS或Debian。
- 网络设置:确保节点之间能够互相通信,并配置好防火墙规则。
- 基础工具:需要安装Docker(或其他容器运行时)以及kubectl命令行工具。
2. 安装Docker
Docker是K8s的核心组件之一,首先需要在每个节点上安装Docker。
对于Ubuntu系统,可以使用以下命令进行安装:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce
安装完成后,使用以下命令验证Docker是否安装成功:
sudo systemctl start docker
sudo systemctl enable docker
docker --version
3. 安装Kubernetes组件
接下来,您需要在每个节点上安装K8s的组件,包括kubeadm
、kubelet
和kubectl
。
对于Ubuntu系统,使用以下命令安装K8s组件:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
安装完成后,使用以下命令验证K8s是否安装成功:
kubectl version --client
4. 初始化K8s集群
在主节点上执行以下命令,以初始化K8s集群:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,会输出一段命令,用于将工作节点加入到集群中。请将其保存,以便后续操作。
为了让非root用户也可以使用kubectl,需要执行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5. 安装网络插件
K8s集群需要一个网络插件来实现Pod之间的通信。Flannel是一个常用的网络插件,可以使用以下命令安装:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel.yml
6. 加入工作节点
在工作节点上,使用在初始化时保存的命令,加入到K8s集群。例如:
kubeadm join <控制平面节点IP>:<API端口> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
7. 验证集群状态
在主节点上,使用以下命令检查集群状态,确认所有节点均已成功加入:
kubectl get nodes
8. 部署应用程序
一旦集群搭建完成,您就可以开始部署应用程序。以下是一个简单的示例,展示如何在K8s中部署一个nginx应用:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
使用以下命令部署该应用:
kubectl apply -f nginx-deployment.yaml
9. 访问应用程序
为了访问您部署的nginx应用,您需要暴露该服务。可以创建一个Service来实现:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30001
selector:
app: nginx
使用以下命令创建Service:
kubectl apply -f nginx-service.yaml
通过访问任意工作节点的IP地址和NodePort(在本例中为30001),您就可以访问nginx服务。
10. 监控与管理
成功部署K8s集群后,您可以使用多种工具来监控和管理集群,例如Grafana、Prometheus等。这些工具可以帮助您实时监控集群的性能、资源使用情况以及应用的健康状态。
结论
部署自建K8s集群虽然需要一些前期准备和配置,但一旦成功,您将能够更灵活地管理和扩展应用程序。K8s的强大功能能够为您的DevOps流程带来极大的便利。通过上述步骤,您可以快速搭建起一个K8s集群,并开始享受其带来的好处。
关于 GitLab 的更多内容,可以查看官网文档:
官网地址: https://gitlab.cn
文档地址: https://docs.gitlab.cn
论坛地址: https://forum.gitlab.cn
原创文章,作者:xiaoxiao,如若转载,请注明出处:https://devops.gitlab.cn/archives/49619