文章目录
总体架构
1个master node, 2个work node
hostname | os | ip | plugins |
---|---|---|---|
k8s-master | Ubuntu 18.04 | 192.168.199.128 | docker-20.10.6; kubeadm-1.18.3;kubelet-1.18.3; kubectl-1.18.3 |
k8s-node1 | Ubuntu 18.04 | 192.168.199.129 | docker-20.10.6; kubeadm-1.18.3;kubelet-1.18.3; kubectl-1.18.3 |
k8s-node2 | Ubuntu 18.04 | 192.168.199.130 | docker-20.10.6; kubeadm-1.18.3;kubelet-1.18.3; kubectl-1.18.3 |
1. 关闭防护墙、selinux、swap
关闭原因主要是出于开发方便和性能,具体原因可参考知乎。
- 关闭防火墙
sudo ufw disable
- 关闭selinux
sudo apt install selinux-utils
setenforce 0
- 关闭swap
- 暂时关闭。重启后失效
sudo swapoff -a
- 永久关闭(推荐)
为了使节点重启以后,kubelet能够自动启动,建议永久关闭swap
注释掉/swapfile那一行sudo vim /etc/fstab
2. 添加apt kube源
sudo vim /etc/apt/sources.list
在sources.list
中添加一行
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
添加公钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
更新apt
sudo apt update
Ubuntu更换apt镜像源可以参考Ubuntu 18.04 更换apt源
3. 安装kubeadm, kubelet, kubectl
这里选用1.18.3版本
sudo apt install -y kubeadm=1.18.3-00 kubelet=1.18.3-00 kubectl=1.18.3-00
设置kubelet开机自启动
sudo systemctl enable kubelet
4. 安装Docker
5. 克隆虚拟机
利用VMware克隆虚拟机,上方菜单栏 虚拟机 —> 管理 —> 克隆
6. kubeadm配置
kubeadm相关指令
kubeadm init ## 启动一个 Kubernetes 主节点
kubeadm join ## 启动一个 Kubernetes 工作节点并且将其加入到集群
kubeadm upgrade ## 更新一个 Kubernetes 集群到新版本
kubeadm config ## 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令
kubeadm token ## 管理 kubeadm join 使用的令牌
kubeadm reset ## 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改
kubeadm init的参数
## API Server与其他节点的通信接口
--apiserver-advertise-address string
## API Server将要广播的监听地址。如指定为 `0.0.0.0` 将使用缺省的网卡地址。
--apiserver-bind-port int32 缺省值: 6443
## API Server绑定的端口
--apiserver-cert-extra-sans stringSlice
## 可选的额外提供的证书主题别名(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。
--cert-dir string 缺省值: "/etc/kubernetes/pki"
## 证书的存储路径。
--config string
## kubeadm配置文件的路径。警告:配置文件的功能是实验性的。
--cri-socket string 缺省值: "/var/run/dockershim.sock"
## 指明要连接的CRI socket文件
--dry-run
## 不会应用任何改变;只会输出将要执行的操作。
--feature-gates string
## 键值对的集合,用来控制各种功能的开关。可选项有:
Auditing=true|false (当前为ALPHA状态 - 缺省值=false)
CoreDNS=true|false (缺省值=true)
DynamicKubeletConfig=true|false (当前为BETA状态 - 缺省值=false)
-h, --help
## 获取init命令的帮助信息
--ignore-preflight-errors stringSlice
## 忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。 例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。
--kubernetes-version string 缺省值: "stable-1"
## 为control plane选择一个特定的Kubernetes版本。
--node-name string
## 指定节点的名称。
--pod-network-cidr string
## 指明pod网络可以使用的IP地址段。 如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。
--service-cidr string 缺省值: "10.96.0.0/12"
## 为service的虚拟IP地址另外指定IP地址段
--service-dns-domain string 缺省值: "cluster.local"
## 为services另外指定域名, 例如: "myorg.internal".
--skip-token-print
## 不打印出由 `kubeadm init` 命令生成的默认令牌。
--token string
## 这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例: abcdef.0123456789abcdef
--token-ttl duration 缺省值: 24h0m0s
## 令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。
7. 初始化master节点
首先修改master的主机名,否则后面节点加入集群以后修改名字会非常麻烦
hostnamectl --static set-hostname k8s-master
hostname $hostname
初始化master节点需要拉取的镜像有
- kube-proxy
- kube-apiserver
- kube-scheduler
- kube-controller-manager
- pause
- coredns
- etcd
由于这些镜像的地址在国外,访问受限,所以需要在命令中使用--image-repository
添加国内镜像源
sudo kubeadm init --kubernetes-version=v1.18.3 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=[your_ip_addr] \
--image-repository registry.aliyuncs.com/google_containers
其中[your_ip_addr]
可以使用ip addr
查看ens33
字段获得。
如果ip地址填写错误,会产生k8s Initial timeout of 40s passed
这个错误。
安装成功以后,会出现这个画面
按照提示,继续操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
这样就在Master上安装了Kubernetes,但是在集群内还是没哟可用的工作节点Node,并缺乏对容器网络的配置。这里需要注意的是kubeadm init
命令执行完成后几行提示信息,其中包括了加入节点的指令kubeadm join
和所需的Token
。
此时,可以使用命令kubectl get -n kube-system configmap
验证一下ConfigMap:
使用指令kubectl get nodes
验证集群,可以看到集群中现在已经有了一个节点:
8. 在集群中添加work节点
修改k8s-node1主机名
hostnamectl --static set-hostname k8s-node1
hostname $hostname
在k8s-node1主机中,执行下列命令,加入集群
sudo kubeadm join 192.168.199.128:6443 --token [your_token]
修改k8s-node2主机名
hostnamectl --static set-hostname k8s-node2
hostname $hostname
在k8s-node2主机中,执行下列命令,加入集群
kubeadm join 192.168.199.128:6443 --token [your_token]
在master节点中,使用kubectl get nodes
查看集群状态
因为尚未安装网络插件,所以所有节点的STATUS都为NotReady。
9. 安装网络插件flannel
在master节点上安装flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml
安装完flannel之后,等待30s左右,在master上执行下列指令
kubectl get nodes
发现所有节点均处于ready状态
10. 集群状态检测
创建pod,验证集群
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
在任意一个节点通过
ip:port
都能访问到部署的服务