Kubernetes集群安装

安装

我们只是搭建一个 mini 的类似于真实的 kubernetes 环境,用来自己学习,我们也可以选择安装 minikube

安装前的准备工作

  1. 修改 hostname,因为 kubernetes 使用 hostname 来区分集群

    sudo vim /etc/hostname
  2. 使用 docker 作为容器运行时,kubernetes 支持多种容器运行时,使用 docker 比较方便。

    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. 修改 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. 修改 /etc/fstab,关闭 Linux Swap 分区,提升 kubernetes 的性能

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

安装 kubeadm

以 ubuntu 系统为例

sudo apt install -y apt-transport-https ca-certificates curl

#Ubuntu 22.04 LTS以前的版本使用这个命令
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
#Ubuntu 22.04 LTS及其以后的版本使用这个命令添加镜像源
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update
#安装指定的版本,也可以不指定,默认安装最新版
sudo apt install -y kubeadm=1.27.3-00 kubelet=1.27.3-00 kubectl=1.27.3-00
#最好锁定版本
sudo apt-mark hold kubeadm kubelet kubectl

#使用如下的命令验证安装情况
kubeadm version
kubectl version --client

下载 Kubernetes 组件镜像

为了加快集群的部署速度,可以先下载镜像。 从 Google 下载镜像需要魔法,可以使用国内的镜像站,例如阿里云的镜像

repo=registry.aliyuncs.com/google_containers

for name in `kubeadm config images list --kubernetes-version v1.27.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

也可以使用代理工具

sudo systemctl set-environment HTTP_PROXY=127.0.0.1:1080
sudo systemctl set-environment HTTPS_PROXY=127.0.0.1:1080
# 注意,如果设置了proxy,一定要把本机的ip的地址中加入到NO_PROXY
sudo systemctl set-environment NO_PROXY=127.0.0.1,localhost,master,192.168.31.159
sudo systemctl show-environment #查看已经配置的环境变量
sudo systemctl restart containerd.service
sudo kubeadm config images pull

安装 master 节点

kubeadm init  --apiserver-advertise-address=192.168.31.159  --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version v1.27.3  --service-cidr=10.96.0.0/12  --pod-network-cidr=10.244.0.0/16

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/202307112315402.png

遇到的问题

container runtime is not running:

需要修改 /etc/containerd/config.toml 配置文件,查看 cri 插件是否被禁用

6443 端口没有监听,是因为用的 containerd 作为容器运行时,这个需要单独配置

默认 kubeadm 使用的是 systemd 作为驱动,所以 containerd 也要配置 Systemd。

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
 SystemdCgroup = true

注意,如果是发行版自带的 containerd,可能默认的配置文件,不是这样的,可以使用containerd config default > /etc/containerd/config.toml获取默认的配置文件,然后再做修改

安装成功会有如下的提示,根据提示操作即可

#Your Kubernetes control-plane has initialized successfully!

#To start using your cluster, you need to run the following as a regular user:

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

#Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

#You should now deploy a pod network to the cluster.
#Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
#  https://kubernetes.io/docs/concepts/cluster-administration/addons/

#Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.31.159:6443 --token e9uygt.cl9w56si9xje59tt \
	--discovery-token-ca-cert-hash sha256:1852654cb71afc09f5c7ff1895e10a79bc283255d160ffaae21e53c5736c7316

tips

查看日志 journalctl -xe -f /usr/bin/kubelet

运行 kubeadm reset 之后要删除 $HOME/.kube 目录

安装网络组件

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

参考

https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/