本文章是上一篇文章「使用Kubeadm, Vagrant, Virtualbox部署本地Kubernetes集群 」的 TL;DR 版本。
目标
- 启动两个虚拟机,一个作为主节点,一个作为工作节点
- 熟悉 Kubeadm
- 在集群上部署Kubernetes-dashboard、nginx
环境相关
- 操作系统:macOS Mojave 10.14.3 (18D109)
- 编排工具:Vagrant 2.2.3
- 虚拟机:Virtualbox 6.0
- 可变参数:注意所有替换文中所有的${xxx}为自己环境的值
实验环境设计
使用 Vagrant 配合 Virtualbox 建立两个节点模拟集群,一个作为 master node,一个作为 work node。
要求
- master:
- network:
- 8001:8001/tcp
- 80:10000/tcp
- network:
- worker:
- network:
- 80:10001/tcp
- network:
- master & worker:
- OS: Ubuntu/xenial64
- CPU: 2 core
- MEM: 2 GB
- network:
- iface x 2: NAT & Host-Only
- dependencies:
- kubelet
- kubectl
- kubeadm
- docker
Vagrantfile
$script = <<-SCRIPT
echo "Update and install the kubeadm"
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl docker.io
apt-mark hold kubelet kubeadm kubectl
usermod -aG docker vagrant
kubeadm config images pull
SCRIPT
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
config.vm.define "master", primary: true do |master|
master.vm.hostname = "k8s-cluster-master"
master.vm.box = "ubuntu/xenial64"
master.vm.network "forwarded_port", guest: 80, host: 10000, protocol: "tcp"
master.vm.network "forwarded_port", guest: 8001, host: 8001, protocol: "tcp"
master.vm.network "private_network", type: "dhcp"
master.vm.provision "shell", inline: $script
end
config.vm.define "node" do |node|
node.vm.hostname = "k8s-cluster-node"
node.vm.box = "ubuntu/xenial64"
node.vm.network "forwarded_port", guest: 80, host: 10001, protocol: "tcp"
node.vm.network "private_network", type: "dhcp"
node.vm.provision "shell", inline: $script
end
end
启动节点
执行命令vagrant up,Vagrant 开始自动下载Ubuntu镜像,顺利启动后,vagrant 会执行我们写在Vagrantfile里的 Shell 脚本。初始化完成后,在当前窗口执行vagrant ssh master,新开一个窗口执行vagrant ssh node分别 ssh 进入到主节点以及工作节点。
第一次执行vagrant up会看到更多的信息。
使用命令ip a查看当前节点 ip,两个节点互相 ping,检查连通性。
部署 Kubernetes 集群
根据上述 Vagrantfile 创建出来的虚拟机各有两个网卡,第一个是 NAT 模式,第二个是 Host-Only 模式,而 Kubernetes nodes 节点间通讯应该通过第二个网卡,所以选择了 flannel 作为 CNI 插件 🔗,因为它可以指定用于节点间通讯的网卡 (iface)(原因 🔗)。
参考官方文档 🔗,步骤如下:
- 获取 flannel 的 yaml 文件,修改系统参数,并修改 iface 使用第二个网卡。
sudo sysctl net.bridge.bridge-nf-call-iptables=1
wget https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml
# 找到image tag是-amd64结尾的/opt/bin/flanneld,在下面的args列表添加 - --iface 以及 - enp0s8 这两行
# vim kube-flannel.md
- 在主节点 k8s-cluster-master 执行
sudo kubeadm init --apiserver-advertise-address=${ip} --pod-network-cidr=10.244.0.0/16初始化节点,成功后,根据 kubeadm 的输出,执行接下来的命令。 - 复制 kubeadm 生成的配置文件,更改配置文件夹的权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 启动 CNI 插件 flannel
kubectl apply -f kube-flannel.yml
- 把下面 shell 脚本保存为 “change-kubelet-node-ip.sh”,并执行
#!/bin/sh
COND_NODE_IP=`grep node-ip /var/lib/kubelet/kubeadm-flags.env | wc -l`
if [[ ${COND_NODE_IP} = 1 ]]; then
echo "--node-ip had been set, skipped"
exit 0
fi
sudo sed -i '/^.*/ s/$/ --node-ip=${ip}/' /var/lib/kubelet/kubeadm-flags.env
sudo systemctl restart kubelet
- 在 worker节点执行如下脚本,把 worker 节点加入到 Kubernetes 集群
kubeadm join ${master_ip}:6443 --token ${token} --discovery-token-ca-cert-hash sha256:${hash} --apiserver-advertise-address=${worker_ip}
- 在 worker 节点同样运行上述的 “change-kubelet-node-ip.sh”,注意修改脚本里的 ip地址为 worker 节点的 ip。
- 查看节点状态,Pods 状态


部署 Kubernetes Dashboard
- 从Kubernetes Dashboard Repo 🔗获取部署命令,部署 dashboard。
- 查看 pods 状态,直到相关 pods 处于 running 状态。
- 启动 Kubenetes Proxy。
- 通过 proxy 访问 Dashboard: http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 🔗 。(Kubernetes Proxy 是一个反向代理,把外部请求通过主节点/集群,转发到工作节点/集群,避免直接暴露服务,降低安全风险)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
kubectl get pods -n kube-system
kubectl proxy --address 0.0.0.0

部署 Nginx
编写一个 yaml 文件,部署两个 NGINX instance 到集群。
nginx-rs.yaml
保存下面的yaml,命名为 “nginx-rs.yaml”。
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
svc: nginx
type: ClusterIP
ports:
- port: 9999
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
revisionHistoryLimit: 3
selector:
matchLabels:
svc: nginx
template:
metadata:
name: nginx
labels:
svc: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
protocol: TCP
部署
# vi nginx-rs.yaml
kubectl apply -f nginx-rs.yaml
kubectl get pods
kubectl proxy --address 0.0.0.0
在宿主机打开 http://localhost:8001/api/v1/namespaces/default/services/nginx/proxy/ 🔗 即可看到熟悉的 NGINX 默认首页。(Kubernetes proxy URL 规则 🔗)
完
此篇文章省略了在实验期间踩过的大量的坑,如果跟着我的流程下来遇到了什么问题可以先查看上一篇文章「{% post_link Local-kubernetes-cluster-with-kubeadm-vagrant-and-virtualbox %}」,可能你会找到答案,或者在下方留言评论。