【k8s系列】二、kubeadm安装k8s

622 阅读2分钟

为了简化 Kubernetes 的部署,让k8s能够更“接地气”,社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫“kubeadm”,意思就是“Kubernetes 管理员”。
kubeadm用容器和镜像来封装 Kubernetes 的各种组件,但它的目标不是单机部署,而是要能够轻松地在集群环境里部署 Kubernetes,并且让这个集群接近甚至达到生产级质量。
本次安装的的k8s版本为1.23.3,是k8s最后一个支持 docker的版本

系统架构

Xnip2022-09-13_13-58-52.jpg

准备

1. 修改主机名

k8s使用主机名来区分集群里的节点,所以每个节点的hostname必须不能重名。
修改“/etc/hostname”这个文件,把它改成容易识别的名字,分别为master、worker。

机器配置如下:

master节点配置

  • CPU:2核
  • 内存:4G
  • 硬盘:20G
  • ip地址设置为:192.168.56.202

worker节点配置

  • CPU:1核
  • 内存:1G
  • 硬盘:20G
  • ip地址设置为:192.168.56.203

linux发行版:Ubuntu 22.04.1

2. 安装docker

sudo apt install -y docker.io

启动docker

sudo service docker start 

当前用户加入docker组

sudo usermod -aG docker ${USER}

查看docker版本

docker version

修改/etc/docker/daemon.json

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
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

3. 修改Ubuntu网络配置

为了让 Kubernetes 能够检查、转发网络流量,需要修改 iptables 的配置,启用“br_netfilter”模块

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system

4. 关闭Linux的swap分区

提升 Kubernetes 的性能

sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

上述步骤,设置完成后,重启下操作系统,并做好系统快照

安装

1. 安装kubeadm

a. 添加软件仓库源

sudo apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update

b. 安装kubeadm

sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

c. 查看kubeadm版本

kubeadm version
kubectl version --client

d. 锁定kubeadm软件的版本

使用apt-mark hold ,锁定这三个软件的版本,避免意外升级导致版本错误

sudo apt-mark hold kubeadm kubelet kubectl

2. 提前下载用到的容器镜像

查看kubernetes 1.23.3需要的镜像

kubeadm config images list --kubernetes-version v1.23.3

执行后会返回如下信息:

k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

以容器的方式启动 Kubernetes,这些镜像不是放在 Docker Hub 上
而是放在 Google 自己的镜像仓库网站 gcr.io,而它在国内的访问很困难,直接拉取镜像几乎是不可能的。
从国内的镜像网站下载然后再用 docker tag 改名,能够使用 Shell 编程实现自动化

执行images.sh脚本提前下载需要的镜像

repo=registry.aliyuncs.com/google_containers

for name in `kubeadm config images list --kubernetes-version v1.23.3`; do

    src_name=${name#k8s.gcr.io/}
    src_name=${src_name#coredns/}

    docker pull $repo/$src_name

    docker tag $repo/$src_name $name
    docker rmi $repo/$src_name
done

添加执行权限

chmod u+x images.sh

执行脚本,下载master节点需要镜像

./images.sh

image.png

3. 安装master节点

kubeadm 的用法非常简单,只需要一个命令 kubeadm init 就可以把组件在 Master 节点上运行起来。
--pod-network-cidr,设置集群里 Pod 的 IP 地址段。
--apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。
--kubernetes-version,指定 Kubernetes 的版本号。

sudo kubeadm init \
    --pod-network-cidr=10.10.0.0/16 \
    --apiserver-advertise-address=192.168.56.202 \
    --kubernetes-version=v1.23.3

kubeadm 的安装过程很快就完成了,它还会提示出接下来要做的工作

a. 在本地建立一个“.kube”目录,然后拷贝 kubectl 的配置文件,只要原样拷贝粘贴就行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

b. 还有一个很重要的“kubeadm join”提示,其他节点要加入集群必须要用指令里的 token 和 ca 证书

kubeadm join 192.168.10.210:6443 --token tv9mkx.tw7it9vphe158e74 \
  --discovery-token-ca-cert-hash sha256:e8721b8630d5b562e23c010c70559a6d3084f629abad6a2920e87855f8fb96f3

c. 安装完成后,可以使用 kubectl version、kubectl get node 来检查Kubernetes 的版本和集群的节点状态了

kubectl version
kubectl get node

Master 节点的状态是“NotReady”,这是由于还缺少网络插件,集群的内部网络还没有正常运作

d. 安装flannel网络插件

Kubernetes 定义了 CNI 标准,有很多网络插件, 本次选择 Flannel,可以在它的 GitHub 仓库里 https://github.com/flannel-io/flannel下载
修改kube-flanner.yml文件内容

  net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

多网卡环境下 flannel 网络插件会出现DNS 无法解析,因此需要调整下 flannel 的启动参数,加上 - --iface=eth1 网卡参数:- --kube-subnet-mgr 后面加一行参数:- --iface=eth1

注意eth1 ,可能网卡名称不是eth1,可以使用ip addr查看

containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.11.0-amd64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth1

修改后使用kubectl apply -f kube-flannel.yml来安装 Flannel 网络了。
稍等一小会,再次使用kubectl get node来看节点状态,应该能够看到 Master 节点的状态是“Ready”

4. 安装worker节点

提前下载安装需要的镜像

images.sh内容如下:

repo=registry.aliyuncs.com/google_containers
for name in `kubeadm config images list --kubernetes-version v1.23.3`;
do

    # remove prefix
    src_name=${name#k8s.gcr.io/}
    src_name=${src_name#coredns/}

    # worker only needs kube-proxy/pause
    if [[ "$src_name" =~ "kube-proxy" ]] ||
       [[ "$src_name" =~ "pause" ]] ||
       [[ "$src_name" =~ "coredns" ]] ; then

        docker pull $repo/$src_name

        # rename to fit k8s
        docker tag $repo/$src_name $name
        docker rmi $repo/$src_name
    fi

done

# enable network
docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
docker pull rancher/mirrored-flannelcni-flannel:v0.17.0

添加执行权限

chmod u+x images.sh

运行脚本,下载worker节点需要的镜像

./images.sh

安装

如果成功安装了 Master 节点,那么 Worker 节点的安装就简单多了,只需要用之前拷贝的那条 kubeadm join 命令就可以了,记得要用 sudo 来执行:

kubeadm join 192.168.56.202:6443 --token tv9mkx.tw7it9vphe158e74 \
  --discovery-token-ca-cert-hash sha256:e8721b8630d5b562e23c010c70559a6d3084f629abad6a2920e87855f8fb96f3

Worker 节点安装完毕后,执行 kubectl get node ,就会看到两个节点都是“Ready”状态

5. 测试

kubectl run ,运行 Nginx 来测试一下

kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide

希望本篇文章对你有所帮助,谢谢。