本地 ubuntu18.04 VM 安装 k8s

Posted by Luffyao on Saturday, July 25, 2020

安装步骤

安装虚拟机

安装至少需要安装两个 ubuntu 虚拟机,根据个人需求,和电脑配置,这里我是两个虚拟机,一个 master ,一个 node 。每个虚拟机 2 CPU,4G 内存。

配置虚拟机网络

为了满足我们的需求,我们需要为每个虚拟机配置两个虚拟网卡,一个配置为 NAT,用于可以上网,另一个配置为 host-only ,用于虚拟机之间,宿主机和虚拟机之间可以通信。

详细配置请参考 VirtualBox 虚拟机组网 这篇文章。

国内源配置

众所周知,国内是访问不了外网的,所以下载 k8s 相关的镜像是需要配置国内源才能使用。请使用下面命令更新数据源。

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

sudo add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"

安装 docker

curl -fsSL https://get.docker.com | sudo sh -s -- --mirror Aliyun
sudo usermod -aG docker $USER
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "registry-mirrors": ["https://t9ab0rkd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

安装 k8s 组件

sudo apt update && apt install -y kubelet kubeadm kubectl

source <(kubectl completion bash)
source <(kubeadm completion bash)

关闭 swap

可以使用这条命令 sudo swapoff -a 暂时关闭,推荐永久关闭,可使用下面命令:

vim /etc/fstab

# UUID=9224d95f-cd87-4b56-b249-3dc7de4491d3 none            swap    sw              0       0

初始化 master 节点

由于网络原因,可以先使用国内源下载相关的镜像。

创建一个文件 k8s_script.sh ,并添加下面内容:

#! /bin/bash
images=(
    kube-apiserver:v1.18.6
    kube-controller-manager:v1.18.6
    kube-scheduler:v1.18.6
    kube-proxy:v1.18.6
    pause:3.2
    etcd:3.4.3-0
    coredns:1.6.7
)

for imageName in ${images[@]} ; do
    sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName  k8s.gcr.io/$imageName
done

然后给脚本文件添加可执行权限 chmod +x k8s_script.sh 。最后执行 ./k8s_script.sh 脚本文件获取镜像。

最后使用 kubeadm 命令安装 master 节点

sudo kubeadm init --apiserver-advertise-address=192.168.56.22 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.18.2

下面是相关参数解释:

  • –apiserver-advertise-address: k8s 中的主要服务 apiserver 的部署地址,填自己的管理节点 ip。 这里我填的是 master 地址
  • –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。错误名称在初始化错误时会给出来。

当你初始化成功的时候,将会出现下面这些信息:

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

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.56.22:6443 --token wt4oj5.n61xgqy8dikb1s42 \
    --discovery-token-ca-cert-hash sha256:b80851020e143feece7ec63168cfbb82d26b34d3ea848992b8d65653df66e8c1

这里需要配置下面命令,是的能够使用 kubectl 命令:

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

最后请记住这条命令 kubeadm join 192.168.56.22:6443 --token wt4oj5.n61xgqy8dikb1s42 --discovery-token-ca-cert-hash sha256:b80851020e143feece7ec63168cfbb82d26b34d3ea848992b8d65653df66e8c1 。我们将要在下一步将 node 的节点加入到 master 节点需要输入这条命令, 将 node 加入到 master 中。如果不记得这条命令,可以在 master 节点上执行 kubeadm token create --print-join-command 命令重新生成一条。

添加网络插件

在上一步 kubeadm init 之后,我们可以使用 kubectl get pods -n kube-system 命令查看相关的 pod 状态。我们会看到 coredns 相关的 pod 并没有 running 。 这里我们需要配置下网络插件才能使得 coredns 正常运行。下面有几种方法可以使用:

  1. CNI bridge

    mkdir -p /etc/cni/net.d
    cat >/etc/cni/net.d/10-mynet.conf <<-EOF
    {
        "cniVersion": "0.3.0",
        "name": "mynet",
        "type": "bridge",
        "bridge": "cni0",
        "isGateway": true,
        "ipMasq": true,
        "ipam": {
            "type": "host-local",
            "subnet": "10.244.0.0/16",
            "routes": [
                {"dst": "0.0.0.0/0"}
            ]
        }
    }
    EOF
    cat >/etc/cni/net.d/99-loopback.conf <<-EOF
    {
        "cniVersion": "0.3.0",
        "type": "loopback"
    }
    EOF
    
  2. flannel

    需要在 kubeadm init 时设置 --pod-network-cidr=10.244.0.0/16 。然后执行下面那条命令。

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    NOTE: 这里可以看到,我使用的是这种方式。详细请看 flannel

  3. weave

    sysctl net.bridge.bridge-nf-call-iptables=1
    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    
  4. calico

    需要在 kubeadm init 时设置 --pod-network-cidr=10.244.0.0/16 。然后执行下面那条命令。

    kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
    wget https://docs.projectcalico.org/manifests/custom-resources.yaml
    修改 CIDR 和 kubeadm init 时 --apiserver-advertise-address 的地址一致
    kubectl apply -f custom-resources.yaml
    

    NOTE: 详细情况 quickstart

将 node 节点加入到 master 节点

如果只想部署单个 node 节点,则需要将 master 节点的污点删除。可以使用该命令去删除:kubectl taint nodes --all node-role.kubernetes.io/master-

首先同样需要在 node 节点的虚拟机上执行上面 [配置虚拟机网络](#配置虚拟机网络),[国内源配置](#国内源配置),[安装 docker](#安装 docker),[安装 k8s 组件](#安装 k8s 组件),[关闭 swap](#关闭 swap) 这几步, 然后执行 master 节点上 init 时产生的命令将 node 加入到 master 中。

sudo kubeadm join 192.168.56.22:6443 --token wt4oj5.n61xgqy8dikb1s42 --discovery-token-ca-cert-hash sha256:b80851020e143feece7ec63168cfbb82d26b34d3ea848992b8d65653df66e8c1

此时,在 master 节点上使用 kubectl get nodes -o wide 命令将能看到加入的 node 信息。

比如下面我的环境信息:

master@master-VirtualBox:~$ kubectl get node -o wide
NAME                 STATUS   ROLES    AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
master-virtualbox   Ready    master   102m   v1.18.6   10.0.2.15     <none>        Ubuntu 18.04.2 LTS   5.3.0-62-generic    docker://18.6.3
work1-virtualbox     Ready    <none>   97m    v1.18.6   10.0.2.15     <none>        Ubuntu 18.04.2 LTS   4.18.0-15-generic   docker://19.3.9

测试环境

这里可以安装一个 deployment 验证一下环境是否可用。

  1. 创建一个 deployment.yaml 文件。 内容如下:

     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: test
     spec:
       replicas: 2
       selector:
         matchLabels:
           app.kubernetes.io/name: test
       template:
         metadata:
           labels:
             app: web
             app.kubernetes.io/name: test
         spec:
           containers:
             - name: front-end
               image: nginx
               imagePullPolicy: IfNotPresent
               ports:
                 - containerPort: 80
    
  2. 创建 deployment。

    kubectl apply -f deployment.yaml
    
  3. 检查是否正常运行。

    master@master-VirtualBox:~$ kubectl get pods
    NAME                    READY   STATUS    RESTARTS   AGE
    test-757d9fbc68-9n9gs   1/1     Running   0          6s
    test-757d9fbc68-v5gdh   1/1     Running   0          6s
    

卸载环境

可以使用 kubectl delete node nodename 去删除某个 node,但是这种方式不能删除 node 上的资源。只有使用 sudo kubeadm reset 可以彻底清除安装。如果删除 master ,则直接可以使用 sudo kubeadm reset 删除。

参考文章