安装步骤
安装虚拟机
安装至少需要安装两个 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 正常运行。下面有几种方法可以使用:
-
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
-
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
-
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')"
-
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 验证一下环境是否可用。
-
创建一个
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
-
创建 deployment。
kubectl apply -f deployment.yaml
-
检查是否正常运行。
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
删除。