环境规划:

ip主机名内存cpu安装软件系统版本
172.17.66.66/16u-master014G2核kubectl,kubeadm,kubelet,etcd22.04
172.17.88.88/16u-node014G2核kube-proxy22.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

这里介绍一下一些常用参数的含义:

  1. apiserver-advertise-address: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip
  2. image-repository: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。
  3. pod-network-cidr: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好
  4. kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。
  5. 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解析正常
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐