在容器化技术日益普及的今天,Kubernetes(简称k8s)已经成为企业级容器编排的事实标准。而KubeSphere作为一款开源的Kubernetes管理平台,为k8s提供了友好的可视化界面和丰富的功能扩展。本文将详细介绍在CentOS系统上从零开始部署k8s 1.23.17版本并集成KubeSphere的全过程。
这个部署方案特别适合以下场景:
在开始部署前,我们需要确保环境满足以下最低要求:
注意:生产环境建议使用更高配置,特别是内存和CPU资源。KubeSphere对资源要求较高,小型环境可能会出现性能问题。
在所有节点上执行以下基础配置:
bash复制# 设置主机名(在各节点分别执行)
hostnamectl set-hostname master-node # 在master节点执行
hostnamectl set-hostname worker-node1 # 在worker节点执行
# 编辑/etc/hosts文件,添加所有节点的IP和主机名映射
echo "192.168.1.100 master-node" >> /etc/hosts
echo "192.168.1.101 worker-node1" >> /etc/hosts
bash复制setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
bash复制swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
bash复制cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
Kubernetes 1.23版本支持多种容器运行时,这里我们选择Docker作为容器运行时环境。
bash复制# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
yum install -y docker-ce docker-ce-cli containerd.io
# 启动Docker并设置开机自启
systemctl enable docker && systemctl start docker
bash复制mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl restart docker
在所有节点上执行以下命令安装Kubernetes组件:
bash复制cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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
EOF
bash复制yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17 --disableexcludes=kubernetes
systemctl enable --now kubelet
在master节点上执行初始化命令:
bash复制kubeadm init \
--kubernetes-version=v1.23.17 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.100 \
--ignore-preflight-errors=Swap
注意:这里的
--apiserver-advertise-address需要替换为你master节点的实际IP地址。
初始化成功后,会输出类似以下信息:
code复制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 192.168.1.100:6443 --token xxxx.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
按照提示执行以下命令配置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
Kubernetes需要网络插件来实现Pod间的通信,这里我们选择Flannel:
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
验证网络插件是否正常工作:
bash复制kubectl get pods -n kube-system
应该能看到flannel相关的pod处于Running状态。
在每个worker节点上执行master节点初始化成功后输出的join命令,例如:
bash复制kubeadm join 192.168.1.100:6443 --token xxxx.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
加入成功后,在master节点上执行以下命令查看节点状态:
bash复制kubectl get nodes
所有节点应该显示为Ready状态。
在部署KubeSphere前,我们需要确保集群满足以下要求:
bash复制kubectl get nodes
kubectl describe node <node-name>
bash复制curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
bash复制kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/kubesphere-installer-cr.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.1/cluster-configuration.yaml
bash复制kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
安装完成后,获取KubeSphere控制台的访问地址:
bash复制kubectl get svc -n kubesphere-system | grep ks-console
默认情况下,KubeSphere控制台服务类型为NodePort,可以通过任意节点的IP和分配的端口号访问。默认用户名和密码为:
安全提示:首次登录后请立即修改默认密码!
如果kubeadm init命令长时间卡住,可能是镜像拉取问题。可以尝试以下解决方案:
bash复制kubeadm config images pull --kubernetes-version=v1.23.17
bash复制cat /etc/docker/daemon.json
确保配置了正确的镜像仓库或代理。
如果节点长时间处于NotReady状态,可能的原因和解决方案:
bash复制kubectl get pods -n kube-system
检查flannel或calico等网络插件pod是否正常运行。
bash复制journalctl -u kubelet -f
KubeSphere安装失败通常是由于资源不足导致:
bash复制kubectl top nodes
kubectl describe pods -n kubesphere-system
bash复制vim cluster-configuration.yaml
将ks-installer的spec中的components设置为最小安装。
bash复制kubectl get componentstatuses
kubectl get nodes
bash复制kubectl get pods -n kube-system
bash复制kubectl get events --sort-by=.metadata.creationTimestamp
KubeSphere内置了监控功能,但也可以额外配置:
bash复制kubectl edit cc -n kubesphere-system ks-installer
将spec.monitoring.enabled设置为true
bash复制ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
bash复制ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
--data-dir /var/lib/etcd-backup
对于生产环境部署,建议考虑以下增强措施:
高可用部署:
安全加固:
存储方案:
日志收集:
性能优化:
在实际操作中,我发现以下几个经验点特别值得注意: