kubeadm是Kubernetes官方提供的快速安装k8s集群的工具,所以本次部署就选择这个工具了。
今天这个时间打开github上的kubernetes看到它的latest release已经是v1.15.1了,那就拿它下手,可能看上去步骤会比较多,但是都不困难,一步一步来就好。
一、配置master节点
- /etc/hosts这个文件包含了ip地址和主机名之间的映射,在没有域名解析服务器的情况下,系统上的所有网络程序都通过查询这个文件来解析对应于某个主机名的ip地址,把映射加入其中可以实现快速方便的访问。我们这个简单的集群包含一个master和两个node。所以先执行
vim /etc/hosts
本机的127.0.0.1 可能会对应多个主机别名,我们可以追加一个master别名。(非必要) 必要的是我们要另起一行写下对应node节点的映射
-
关闭防火墙并撤销开机启动(撤销指向配置文件的符号连接关系)
systemctl stop firewalld systemctl disable firewalld
-
禁用selinux&时间同步,一般是没问题,不用操作
-
编辑kubernetes的yum源(如果没有这一步,在第7步的时候用kubeadm部署要去gcr.io等地方拉取k8s的相关镜像,需要科学上网)
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes] name=Kubernetes Repo baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
baseurl 和 gpgkey都在下一步寻找
-
到这个网址寻找kubernetes的yum源http://mirrors.aliyun.com/kubernetes/yum/repos/ 右键画圈那个选择复制链接地址,就是baseurl,返回上一级,在docs里有gpgkey(GNU Privacy Guard,一套用于加密的软件)的两个链接
-
更新docker依赖驱动
扫描二维码关注公众号,回复: 10940332 查看本文章yum install -y yum-utils device-mapper-persistent-data lvm2
写docker-ce的yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看有哪些版本的docker-ce
yum list docker-ce --showduplicates
k8s对应最新的版本19.03会有warning提醒,所以我下载的是18.09
yum install -y docker-ce-18.09.8-3.el7
启动docker&&设置成开机启动
systemctl start docker && systemctl enable docker
这里还要配置一下iptables
cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF
然后执行即时生效命令
sysctl -p /etc/sysctl.d/k8s.conf
-
根据CRI文档,systemd作为docker的cgroup driver可以使服务器在节点资源紧张的情况下更加稳定(原先是cgroupfs),于是我们修改它然后重启docker并检验是否修改成功(阿里镜像加速服务也在这里配置)
vim /etc/docker/daemon.json { "exec-opts":["native.cgroupdriver=systemd"] }
systemctl restart docker docker info|grep Cgroups
如果是显示"Cgroup driver: systemd"则修改成功
-
安装k8s的组件
yum install kubelet kubeadm kubectl
用free -m 命令检验swap是否关闭,如果三个0则说明已关闭,不然执行swapoff -a
-
kubeadm的部署方式要拉取一些镜像,如果不能科学上网,就从阿里云下载到本地然后换掉标签即可,7个镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.1 k8s.gcr.io/kube-apiserver:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.15.1 k8s.gcr.io/kube-scheduler:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.15.1 k8s.gcr.io/kube-controller-manager:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.1 k8s.gcr.io/kube-proxy:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
kubeadm一键部署,集群通信使用flannel(覆盖网络),根据配置文件网络段要选择"10.244.0.0/16"
kubeadm init --kubernete-version="v1.15.1" --pod-network-cidr="10.244.0.0/16"
根据安装成功后最下边的提示还要执行一下三个步骤使非root用户也能使用kubelet
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
10.部署flannel组件
进入https://github.com/coreos,找到第一个项目flannel,点开后下拉找到手动部署命令,即
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
稍等片刻kubectl get nodes就可查看节点状态时Ready了。
二、配置node节点
node节点的前8步同上,在执行完第8步安装k8s组件后,执行
systemctl enable kubelet
node节点需要的镜像有三个proxy pause和flannel,在master节点上执行
docker save -o node.gz k8s.gcr.io/kube-proxy:v1.15.1 quay.io/coreos/flannel:v0.11.0-amd64 k8s.gcr.io/pause:3.1
然后用传输到node节点上
scp node.gz node01:/root
加载到镜像中
docker load -i node.gz
然后执行如下命令把节点加入到集群中
kubeadm join master:6443 --token xx1 --discovery-token-ca-cert-hash sha256:xx2
其中xx1是master生成的token,可以用如下命令生成一个永久有效的token(普通token 24h失效)然后查看并复制
kubeadm token create --ttl 0
kubeadm token list
接着获取ca证书sha256编码的hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
这个命令很诡异,但是没错就是它。将得到的hash填入对应的xx1 xx2,节点就可以加入到集群中。
大约10s的时间在master上运行kubectl get nodes就可以看到node的status是Ready了。
!!!到这一步集群就初步搭建起来了,其实也没有那么困难
坑点:
- 一开始我用系统为centos7.2的云服务器部署,会在node加入集群的时候报一些错误,但其实用7.6版本的时候同样的步骤没有任何问题。
- 如果用阿里云腾讯云等云服务器部署的时候,服务器应该买在同一个地域,用内网通信,如果不同地域会有NAT转换。而Kubernetes 要求 kubelet 和 apiserver 之间必须能不经 NAT 地直接通信,不然在node加入集群的命令kubeadm join没有反应。
- kubernetes v1.15.1版本要求master必须至少有两个核心(较早的版本都只是warning),购买配置时别不舍得。
解决办法:
- kubeadm reset 可以理解为重新部署,安装和启动docker这一步以及之前的步骤不用重来,只需要解决通信等问题后再次kubeadm join即可,要清楚干净需要删掉一些残留数据。
kubeadm reset rm -rf $HOME/.kube/ rm -rf /var/lib/cni/ rm -rf /var/lib/kubelet/* rm -rf /etc/cni/ ip link delete cni0 ip link delete flannel.1 systemctl restart docker