ubuntu22.4安装K8S集群1.23.1版本
环境规划:
| ip | 主机名 | 内存 | cpu | 安装软件 | 系统版本 |
|---|---|---|---|---|---|
| 172.17.66.66/16 | u-master01 | 4G | 2核 | kubectl,kubeadm,kubelet,etcd | 22.04 |
| 172.17.88.88/16 | u-node01 | 4G | 2核 | kube-proxy | 22.04 |
1、修改ubuntu系统配置
修改主机名称
root@u-master01:~# hostnamectl hostname --static u-master01
root@u-master01:~# hostname
u-master01
关闭 swap 内存
这个swap其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭swap。
root@u-master01:~# swapoff -a
root@u-master01:~# sed -ri 's/.*swap.*/#&/' /etc/fstab
确定当前没有开启 Swap
在终端使用命令 free -m 查看输出结果
root@u-master01:~# free -h
total used free shared buff/cache available
Mem: 3.8Gi 1.4Gi 635Mi 41Mi 1.7Gi 2.1Gi
Swap: 0B 0B 0B
可以看到最后一行是0 0 0,则表示当前没有开启。
为什么需要关闭交换分区:在集群中,我们通常是希望如果出现OOM(内存溢出)的情况,就直接终止这个进程,然后kubernetes进行故障转移,把这个进程在其他节点上重启起来。而不是,出现OOM的时候,通过交换分区来延长使用,看似没有问题也不会有报错提示给我们,但是会导致节点hang住(没有响应,卡死)。更可怕的是有一些集群的swap位于机械硬盘阵列上,大量动用swap基本可以等同于死机,你甚至连root都登录不上,不用提杀掉问题进程了,往往结局就是硬盘重启
修改配置
# Enable kernel modules
sudo modprobe overlay && \
sudo modprobe br_netfilter
# Add some settings to sysctl
sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# Reload sysctl
sudo sysctl --system
2、安装docker
安装docker
sudo apt update && \
sudo apt install apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" && \
apt-cache policy docker-ce && \
sudo apt install -y containerd.io docker-ce docker-ce-cli && \
sudo systemctl status docker
配置docker
# Create required directories
sudo mkdir -p /etc/systemd/system/docker.service.d
# Create daemon json config file
mkdir /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://8i185852.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# Start and enable Services
sudo systemctl daemon-reload && \
sudo systemctl restart docker && \
sudo systemctl enable docker
3、安装kubeadm、kubectl以及kubelet
安装完了 docker 就可以下载 k8s 的三个主要组件kubelet、kubeadm以及kubectl了。这一步两台主机都需要进行安装。先来简单介绍一下这三者:
kubelet: k8s 的核心服务
kubeadm: 这个是用于快速安装 k8s 的一个集成工具,我们在master和node01上的 k8s 部署都将使用它来完成。
kubectl: k8s 的命令行工具,部署完成之后后续的操作都要用它来执行
其实这三个的下载很简单,直接用apt-get就好了,但是因为某些原因,它们的下载地址不存在了。所以我们需要用国内的镜像站来下载,也很简单,依次执行下面条命令即可:
使得 apt 支持 ssl 传输
apt-get update && apt-get install -y apt-transport-https
下载 gpg 密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
添加 k8s 镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
安装 kubectl,kubeadm以及 kubelet
apt-get install -y kubelet=1.23.1-00 kubeadm=1.23.1-00 kubectl=1.23.1-00
直接在/etc/apt/sources.list里添加https://mirrors.aliyun.com/kubernetes/apt/是不行的,因为这个阿里镜像站使用的ssl进行传输的,所以要先安装apt-transport-https并下载镜像站的密钥才可以进行下载。
4、初始化控制节点
使用kubeadm的init命令就可以轻松的完成初始化,不过需要携带几个参数,如下。先不要直接复制执行,将赋值给–apiserver-advertise-address参数的 ip 地址修改为自己的master主机地址,然后再执行。
kubeadm init --kubernetes-version=1.23.1 --apiserver-advertise-address 172.17.66.66 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification
这里介绍一下一些常用参数的含义:
- apiserver-advertise-address: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip
- image-repository: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。
- pod-network-cidr: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好
- kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。
- ignore-preflight-errors: 忽略初始化时遇到的错误,比如说我想忽略 cpu 数量不够 2 核引起的错误,就可以用–ignore-preflight-errors=CpuNum。错误名称在初始化错误时会给出来。
当你看到如下字样是,就说明初始化成功了,请把最后那行以kubeadm join开头的命令复制下来,之后安装工作节点时要用到的。

如果你不慎遗失了该命令,可以在master节点上重新生成新的token
kubeadm token create --print-join-command
5、将工作节点加入集群
kubeadm token create --print-join-command
会打印如下一串内容:
kubeadm join 172.17.66.66:6443 --token f0k7h5.wmt8lnqe14d3y5ze --discovery-token-ca-cert-hash sha256:42c829808467c3137fae4406041c4e9fda5a6d66aee56c2c010ee3a7d0f817cb
在工作节点直接执行
kubeadm join 172.17.66.66:6443 --token f0k7h5.wmt8lnqe14d3y5ze --discovery-token-ca-cert-hash sha256:42c829808467c3137fae4406041c4e9fda5a6d66aee56c2c010ee3a7d0f817cb --ignore-preflight-errors=SystemVerification
6、安装K8S集群网络插件
root@u-master01:~# kubectl apply -f calico.yaml
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
poddisruptionbudget.policy/calico-kube-controllers created
验证k8s集群是否安装成功
root@u-master01:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
u-master01 Ready control-plane,master 8m18s v1.23.1
u-node01 Ready <none> 5m13s v1.23.1
root@u-master01:~# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-677cd97c8d-qphm7 1/1 Running 0 2m21s
calico-node-9fxmx 1/1 Running 0 2m21s
calico-node-k7d4v 1/1 Running 0 2m21s
coredns-65c54cc984-4b9x4 1/1 Running 0 9m13s
coredns-65c54cc984-ng7l9 1/1 Running 0 9m13s
etcd-u-master01 1/1 Running 0 9m27s
kube-apiserver-u-master01 1/1 Running 0 9m30s
kube-controller-manager-u-master01 1/1 Running 0 9m28s
kube-proxy-4vkcs 1/1 Running 0 6m26s
kube-proxy-79ggm 1/1 Running 0 9m13s
kube-scheduler-u-master01 1/1 Running 0 9m28s
出现上面状态,说明k8s集群装好
7、 测试集群网络
测试k8s集群的网络和coredns组件是否正常
root@u-master01:~# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # ping www.baidu.com
PING www.baidu.com (14.119.104.189): 56 data bytes
64 bytes from 14.119.104.189: seq=0 ttl=127 time=7.214 ms
64 bytes from 14.119.104.189: seq=1 ttl=127 time=7.483 ms
64 bytes from 14.119.104.189: seq=2 ttl=127 time=8.113 ms
^C
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 7.214/7.603/8.113 ms
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ #
看到上面内容,说明k8s的dns解析正常
更多推荐
所有评论(0)