目录
1. 先决条件
在我们深入研究该过程之前,请确保您满足以下先决条件:
- Linux服务器:至少三台运行Ubuntu 20.04 LTS的服务器(1个主节点,2个工作节点)。
- 访问Internet:节点需要Internet访问才能下载和安装软件包。
2. 环境设置
确保这3个虚拟机或物理机可以看到彼此。如果您没有3个静态IP,您可以按如下方式将它们设置在同一个LAN上:
- 主节点:master-node(IP:192.168.1.100)
- Worker节点1:worker-node-1(IP:192.168.1.101)
- Worker节点2:worker-node-2(IP:192.168.1.102)
2.1 更新和升级服务器
首先更新和升级您的所有服务器:
sudo apt-get update
sudo apt-get upgrade -y
2.2 安装Docker
Kubernetes使用Docker作为其容器运行时。在所有三个节点上安装Docker:
sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
2.3 安装Kubernetes组件
我们需要在所有节点上安装kubeadm、kubelet和kubectl:
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 -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
2.4 初始化Kubernetes主节点
在主节点上,我们将初始化集群。此过程将设置control plane:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,您将看到一个命令,用于将Worker节点加入集群。保存此命令,以便我们稍后需要它。
Your Kubernetes control-plane has initialized successfully!
要开始使用您的集群,您需要以普通用户身份运行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果您是root用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
现在,您应该将Pod网络部署到集群。
运行“kubectl apply -f [podnetwork].yaml”,其中包含以下选项之一:Cluster Networking | Kubernetes
然后,您可以通过以root身份在每个worker节点上运行以下命令来加入任意数量的worker节点:
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
当我设置初始主节点时,我遇到了几个错误。
container runtime is not running: output: level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint "unix:///var/run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
所以我这样做:
sudo apt remove containerd
sudo apt update
sudo apt install containerd.io
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
什么时候
container runtime is not running: output: level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint "unix:///var/run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
kubelet在启用swap的情况下运行,而Kubernetes明确不鼓励使用swap。
所以我这样做:
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
sudo systemctl restart kubelet
sudo systemctl status kubelet
如果您遇到端口错误
sudo fuser -k 6443/tcp
sudo fuser -k 10259/tcp
sudo fuser -k 10257/tcp
sudo fuser -k 10250/tcp
sudo fuser -k 2397/tcp
sudo fuser -k 2380/tcp
sudo rm /etc/kubernetes/manifests/kube-apiserver.yaml
sudo rm /etc/kubernetes/manifests/kube-controller-manager.yaml
sudo rm /etc/kubernetes/manifests/kube-scheduler.yaml
sudo rm /etc/kubernetes/manifests/etcd.yaml
sudo rm -r /var/lib/etcd
3.1 配置kubectl
要开始使用您的集群,请为当前用户配置kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.2 部署Pod网络
Kubernetes需要Pod网络来允许节点之间的通信。我们将使用Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
4. 将Worker节点加入集群
在每个worker节点上,运行初始化后主节点提供的命令。它应如下所示:
sudo kubeadm join 192.168.1.100:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
5. 验证集群设置
要验证所有节点都已加入集群,请运行:
kubectl get nodes -o wide
您应该会看到所有三个节点(1个主节点和2工作节点)都列为ready。
6. 部署示例应用程序
让我们部署一个简单的Nginx应用程序来验证集群是否正常工作。
创建Deployment
我们将创建一个Nginx部署:
kubectl create deployment nginx --image=nginx
将Nginx部署作为服务公开:
kubectl expose deployment nginx --port=80 --type=NodePort
验证部署
kubectl get pods
输出应显示一个正在运行的Nginx Pod
找到分配给Nginx服务的NodePort:
kubectl get service nginx
在浏览器中使用<node ip=""> : <nodeport>访问Nginx服务。您应该会看到Nginx欢迎页面。
7. 扩展应用程序
让我们将Nginx部署扩展到3个副本,看看Kubernetes如何管理多个实例:
kubectl scale deployment nginx --replicas=3
验证扩展:
kubectl get pods
您应该会看到三个Nginx Pod正在运行。
8. 清理
要清理部署和服务,请执行以下操作:
kubectl delete service nginx
kubectl delete deployment nginx
9. 典型的安装问题
9.1 遇到FORBIDDEN时
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get pv
kubectl get deploy
9.2 无法获取当前的服务器API
E0703 22:36:32.702012 9430 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0703 22:36:32.702614 9430 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0703 22:36:32.705110 9430 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0703 22:36:32.705619 9430 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0703 22:36:32.707190 9430 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port?
解决方案:
第1步:在“Worker node/Compute node”上查找文件“/etc/kubernetes/admin.conf ”,如果它不可用,请从“Controller node/master node” 中查找“Copy paste/SCP”。
第2步:在“Worker Node/Compute node”上,在用户主目录下创建一个名为“.kube”的目录,如果它已经存在,则无需担心并移动到该目录中。
mkdir ~/.kube
or,
mkdir -p $HOME/.kube
cd ~/.kube
第3步:创建名为“config”的文件并粘贴“/etc/kubernetes/admin.conf”的内容。
vi config
注意:在复制配置文件上的内容时,请确保下面的提及参数具有正确的主IP,有时它是localhost,但尝试更新主IP。
10. 结论
在本指南中,我们成功地从头开始设置了一个Kubernetes集群,部署了一个示例应用程序,并验证了其功能。手动构建Kubernetes集群可以让您更深入地了解底层基础设施以及Kubernetes的运行方式。此知识对于在生产环境中对集群进行故障排除和优化至关重要。
通过遵循本指南,您现在可以创建和管理Kubernetes集群、部署应用程序,并根据您的需求扩展它们。祝您集群愉快!
本文最初发布于Search
https://www.codeproject.com/Articles/5387259/Building-a-Kubernetes-Cluster-from-Scratch-A-Detai


1万+

被折叠的 条评论
为什么被折叠?



