[GCE]单节点部署kubernetes集群

分类: AUTOMATION 发布于:

使用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

参考

kubeadm 设置工具参考指南

Kubenetes中的证书

无类别域间路由

Creating a single master cluster with kubeadm

Quickstart for Calico on Kubernetes

总结

k8s 至今仍是实现不管是monolithic还是微服务架构最理想的容器编排手段。优点是概念相对来说比较少,入门容易。缺点是每个概念彻底理解清楚非常难,因为每个resource之间的嵌套引用。