[GCE]单节点部署kubernetes集群
使用kubeadm部署单master节点的k8s, 1个master + 2个minion
1. 安装Docker以及Master节点初始化
安装docker
sudo apt install docker.io
sudo systemctl enable docker
安装kubeadm
sudo apt-get update \
&& sudo apt-get install -y apt-transport-https \
&& curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# k8s的资源暂不可用,使用16.04的更新资源 (xenial)
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" \
| sudo tee -a /etc/apt/sources.list.d/kubernetes.list \
&& sudo apt-get update
sudo apt install -y kubeadm kubelet kubernetes-cni
关闭交换分区
sudo swapoff -a
sudo rm -f /swapfile
sudo vi /etc/fstab # 注释点 /swapfile 入口
sudo swapon --summary # 确认,如果没有输出,表明已经关闭
cat /proc/swaps
- 关闭交换分区的原因,官方的说法是为了性能,设计者希望每个kubelet都可以实时响应
Kubelet/Kubernetes should work with Swap Enabled
2. 初始化master节点
IP_ADDR=$(ip addr show eno1 | grep -Po 'inet \K[\d.]+')
echo $IP_ADDR
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=${IP_ADDR} --kubernetes-version stable-1.2.1
cidr是一个很重要的概念,推荐阅读
CIDR分配的网络资源是网段,而不是具体的地址。所以在AWS或常见云平台上申请网络资源时,先输入CIDR,比如10.1.0.0/16。16对应的子网掩码是255.255.0.0。
默认的情况下,单个master节点是无法正常工作的,它不会分配pods资源。这里有个命令可以使master工作
kubectl taint nodes --all node-role.kubernetes.io/master-
master节点被加入到了资源调度里面去。
3. 安装Pod Network插件
The network must be deployed before any applications. Also, CoreDNS will not start up before a network is installed. kubeadm only supports Container Network Interface (CNI) based networks (and does not support kubenet).
网络组件有很多种,Flannel, Weave Net,Calico 等
这里选择calico
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
输出结果确认 kubectl get pods –all-namespaces
- coredns在网络组建没有安装或者没有初始化完毕前是pending的状态
4. 加入Minion节点
kubeadm join 192.168.12.39:6443 --token 9uqyzo.y773su1b99kolayf --discovery-token-ca-cert-hash sha256:10ca82d1b6e3d9402b5243fa360e9c11a05320c1bd39989ab24aea1fcd6f8629
这段命令是kubeadm init以后给出的。
–token 是节点加入凭证,如果忘记了,在master节点上可以重新获取
kubeadm token list
顺利的话, join命令在几秒内就完成了。
加入节点确认
kubectl get nodes
5. 遇到的问题
在ubuntu18.04的版本里,默认CNI插件不兼容k8s 1.12,需要重新编译, 插件地址
https://github.com/containernetworking/plugins
参考
Creating a single master cluster with kubeadm
Quickstart for Calico on Kubernetes
总结
k8s 至今仍是实现不管是monolithic还是微服务架构最理想的容器编排手段。优点是概念相对来说比较少,入门容易。缺点是每个概念彻底理解清楚非常难,因为每个resource之间的嵌套引用。