DevOps
快来分享你的内容吧~
- 2022-12-26
- 2022-12-26
- 2022-12-26
基于腾讯云轻量云服务器搭建k8s集群
## 前言 Kubernetes,也被称为K8s,是一个开源平台,用于自动化容器的部署、扩展和管理。它源于Google,现被各类中大厂与云平台广泛使用。 后续所有项目的分享与改造均部署在Kubernetes集群上,故现在提供简单的部署教程,方便大家实践学习与交流。 ## 服务器配置 1. 腾讯云轻量云服务器 2. 操作系统:Ubuntu Server 24.04 LTS 64bit 3. 规格:2c 2G 4. 数量:3(像平时做简单项目练习,1个也足够了) 5. 位置:香港(推荐,如果是大陆的服务器可能会造成镜像拉不下来,被墙) ## 开启root登录 腾讯轻量服务器安装ubuntu后,系统的默认用户名是 ubuntu,并在安装过程中默认不设置 root 帐户和密码。 想要设置中开启允许 root 用户登录。具体操作步骤如下: 1. 使用 ubuntu 帐户登录。 2. 执行以下命令,设置 root 密码 ```js sudo passwd root ``` 3. 执行以下命令,打开 sshd_config 配置文件 ``` sudo vi /etc/ssh/sshd_config ``` 4. 找到#Authentication, 将 PermitRootLogin 参数修改为 yes,如果 PermitRootLogin 参数被注释,请去掉首行的注释符号(#) 5. 依旧在 #Authentication, 将 PasswordAuthentication 参数修改为 yes,若 sshd_config 配置文件中无此配置项,则添加 PasswordAuthentication yes 项即可 6. 保存/etc/ssh/sshd_config退出后,执行以下命令,重启 ssh 服务 ```js sudo service ssh restart ``` <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/BIIqHaFr34XXfW52.webp" alt="undefined" width="657" /> ## 安装 ### 设置 Host Name 更新 hosts 文件 登录到各个主机,并使用 hostnamectl 命令设置它们各自的主机名。 ```js sudo hostnamectl set-hostname "k8s-master-noble" // Master Node sudo hostnamectl set-hostname "k8s-worker01-noble" // Worker Node 1 sudo hostnamectl set-hostname "k8s-worker02-noble" // Worker Node 2 ``` ### 禁用 swap,加载内核模块 在每个实例上运行以下命令来禁用交换空间,这样 Kubernetes 集群才能顺利工作。 ```js sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab ``` 使用 modprobe 命令加载以下内核模块。 ```js sudo modprobe overlay sudo modprobe br_netfilter ``` 要永久加载这些模块,请创建包含以下内容的文件。 ```js sudo tee /etc/modules-load.d/k8s.conf <<EOF overlay br_netfilter EOF ``` 添加像 IP 转发这样的内核参数。创建一个文件,并使用 sysctl 命令加载参数。 ```js sudo tee /etc/sysctl.d/kubernetes.conf <<EOT net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOT ``` 运行以下命令,加载上述内核参数。 ```js sudo sysctl --system ``` ### 安装配置 Containerd Containerd 为 Kubernetes 提供了容器运行时,在所有三个实例上安装 containerd 首先,安装容器依赖项 ```js sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates ``` 接下来,使用以下命令添加 containerd 存储库。 ```js sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" ``` 现在,使用以下 apt 命令安装 containerd ```js sudo apt update && sudo apt install containerd.io -y ``` 接下来,配置 containerd,使其开始使用 SystemdCgroup 运行下面的命令。 ```js containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1 sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml ``` 配置 containerd 使用正确的 pause 镜像 ```js sudo sed -i 's|registry.k8s.io/pause:3.8|registry.aliyuncs.com/google_containers/pause:3.9|g' /etc/containerd/config.toml ``` 重新启动 containerd 服务,使上述更改生效。 ```js sudo systemctl restart containerd ``` ### 添加 Kubernetes Package Repository Kubernetes 软件包在 Ubuntu 24.04 的默认包存储库中不可用,所以要先添加它的存储库。在每个实例上运行这些步骤。 使用 curl 命令下载 Kubernetes 包存储库的公共签名密钥。 ```js curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/k8s.gpg ``` 接下来,通过运行以下命令添加 Kubernetes 存储库。 ```js echo 'deb [signed-by=/etc/apt/keyrings/k8s.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/k8s.list ``` ### 安装 Kubernetes 部件 (Kubeadm, kubelet & kubectl) ```js sudo apt update sudo apt install kubelet kubeadm kubectl -y ``` ### 安装 Kubernetes 所有的先决条件都满足了,我们可以开始安装 Kubernetes 了。 在 master 节点上执行 Kubeadm 命令,仅用于初始化 Kubernetes 集群。 ```js sudo kubeadm init --pod-network-cidr=192.168.0.0/16 ``` 该命令将为 Kubernetes 集群拉取所需的镜像。成功执行此命令后,我们将得到如下所示的输出。 <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/VRzIU3YbvOhqI1ld.webp" alt="image.png" width="100%" /> 在上面的输出中,我们将获得一系列命令。例如:如何与 kubernetes 群集互动,如何添加 worker 节点到此群集。 在 master 节点上运行以下命令。 ```js mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 接下来,从输出中复制命令以连接 woker 节点,在两个 woker 节点上运行它(当然如果你是单节点,那就没必要了)。 ```js kubeadm join k8s-master-noble:6443 --token qim97y.l0elbuslud7v4yex \ --discovery-token-ca-cert-hash sha256:b3142f33f7cda9a25cfba0c1ab630e2dfbe724887160493edb6d40df014f94df \ --control-plane ``` 运行 kubectl get nodes 命令来验证 worker 节点的状态。 ```js root@k8s-master-noble:~# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master-noble NotReady control-plane 3m27s v1.30.9 ``` 输出确认 worker 节点已加入集群,但状态为 NotReady。我们需要在这个集群上安装 Network Add-on Plugin,例如:calico。 ### 安装 Calico Network Add-on Plugin 安装 Tigera Calico 操作员和自定义资源定义。 ```js kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml ``` 通过创建必要的自定义资源来安装 Calico ```js kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/custom-resources.yaml ``` 使用以下命令确认所有 pod 都在运行。 ```js kubectl get pods -n calico-system k8s-master-noble: Sun Feb 9 18:17:15 2025 NAME READY STATUS RESTARTS AGE calico-kube-controllers-7bcb4d87c9-2mb2s 1/1 Running 0 11m calico-node-7wc66 1/1 Running 0 11m calico-typha-7bfcc9fcc6-t92tw 1/1 Running 0 11m csi-node-driver-rrwlj 2/2 Running 0 11m ``` 删除控制平面上的污点,以便您可以在其上调度 pod ```js kubectl taint nodes --all node-role.kubernetes.io/control-plane- ``` 运行 kubectl get nodes 命令来验证 worker 节点的状态 ```js root@VM-4-7-ubuntu:~# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master-noble Ready control-plane 3m48s v1.30.9 ``` ready,表面集群已经拉起 ## 测试 Kubernetes Installation 为了测试 Kubernetes 安装,我们将创建基于 nginx 的部署,副本计数为 1在 master 节点上执行下面的kubectl 命令。 ```js kubectl create ns demo-app kubectl create deployment nginx-app --image nginx --replicas 1--namespace demo-app kubectl get deployment -n demo-app kubectl get pods -n demo-app root@VM-4-7-ubuntu:~# kubectl get pods -n demo-app NAME READY STATUS RESTARTS AGE nginx-app-69999bf9b8-txj9h 1/1 Running 0 14s ``` 接下来,使用 NodePort 类型公开此部署,运行如下命令 ```js kubectl expose deployment nginx-app -n demo-app --type NodePort --port 80 kubectl get svc -n demo-app NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-app NodePort 10.104.112.105 <none> 80:32556/TCP 0s ``` 在控制台开放端口 <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/mfS84xvEiFyYxaKk.png" alt="image.png" width="100%" /> 然后在浏览器:ip:port验证,至此,集群部署结束~ <img src="https://pic.code-nav.cn/post_picture/1886688532327751682/PIBow5QvGg5wVxV9.webp" alt="image.png" width="100%" />
Bytebase
地址:https://github.com/bytebase/bytebase
《阿里巴巴DevOps实践指南》
地址:https://www.aliyundrive.com/s/yXa47A1zWm7
《阿里巴巴DevOps实践手册》
地址:https://www.aliyundrive.com/s/SDPy5riFUSP
《从DevOps到AIOps运维技术精选》
地址:https://www.aliyundrive.com/s/XjsDsUo4Aap
