1. 环境信息:Ubuntu 16.04, Docker:18.09.8
2. 机器信息:使用4个节点,其中一个部署为master节点,另外三个为普通节点
IP | Role |
10.21.103.111 | Master |
10.21.103.161 | Node |
10.21.103.214 | Node |
10.21.102.182 | Node |
3. 准备工作:由于需要从国外网站上拉取kubernetes(最新版:1.15)镜像,需要能够访问外网,这里设置代理为hk代理
a. 配置/etc/apt/apt.conf,如下所示:
Acquire::http::Proxy "http://username:password@proxyhk.com:8080";
Acquire::https::Proxy"https://username:password@proxyhk.om:8080";
注意:在Ubuntu 16.04中,若密码里有特殊字符,不需要把特殊字符转化为ASCII码,系统会自动转换。例如密码是aabb**,直接输入aabb**
b. 在/root/.bashrc中添加代理,如下所示:
export http_proxy="username:password@proxyhk.com:8080"
export https_proxy="username:password@proxyhk.hcom:8080"
export no_proxy='10.179.175.88,localhost,127.0.0.1'
注意:其中10.179.175.88需要更换为自己的ip,并且配置完毕后执行source /root/.bashrc使之生效
4. 在Master和Node上分别安装kubeadm, kubelet and kubectl,这里可以使用国内源(阿里巴巴镜像站)安装即可,速度较快。具体操作如下:
a. 安装docker. 这部分可以参考
https://blog.csdn.net/ZJZJ0320/article/details/97009603
b. Docker安装并测试完毕后,启动docker,开始安装kubeadm, kubelet and kubectl,这部分Master和Node的操作是一样的。
(1) 更新软件源
apt-get update && apt-get install -y apt-transport-https
(2) 获取并添加gpg证书
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
(3) 添加到源信息列表
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF
(4) 再次更新软件源信息
apt-get update
(5) 执行安装命令
apt-get install -y kubelet kubeadm kubectl
注意:这里默认会安装最新版本的kubelet kubeadm kubectl,截至目前均为1.15版本(2019.7.23),也可以指定版本进行安装,执行
apt-get install -y kubelet=<version> kubeadm=<version> kubectl=<version>
5. 使用kubeadm部署kubernetes1.15集群
这里分为Master和Node两部分介绍.
对于Master
a. 安装kubeadm后,执行
kubeadm init --pod-network-cidr=10.244.0.0/16
注意:执行这一句时电脑一定要能够访问外网
如果只执行上述语句则表示全部使用默认安装,但也有一些参数可以指定,总结部分如下:
--apiserver-advertise-address:这是 API server 用来告知集群中其它成员的地址,这也是在 init 流程的时候用来构建 kubeadm join 命令行的地址。如果不设置(或者设置为 0.0.0.0)那么将使用默认接口的 IP 地址。该地址也被添加到 API Server 使用的证书中 。
--apiserver-bind-port:API server 将绑定的端口。默认为 6443。
--cert-dir:存储证书的路径。默认为 “/etc/kubernetes/pki”。
--config:kubeadm 指定的 配置文件,实际上可以在kubeadm后面加上配置参数,就不用另外写一个配置文件,但是当有配置文件的前提下,优先使用配置文件中的参数。
--skip-preflight-checks:默认情况下,kubeadm 在安装前会进行一系列的 preflight 检查来验证系统。如果需要的话,高级用户可以使用这个参数来跳过这些检查。
--pod-network-cidr:设置网络插件,有很多种可以选。这里选择Flannel,所以--pod-network-cidr=10.244.0.0/16。必须注意的是,在执行init时其他参数可以使用默认,但--pod-network-cidr需要自己指定
b. 安装kubernetes后,出现如下界面表示安装成功,根据红色方框中的提示,执行其语句。
c.安装网络插件,由于我们选择了flannel,所以这里执行
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
d.可以执行kubeadm config images list,会出现如下版本信息。
对于node
a. 安装完Master后,只要把Node加入到Master就可以了。由于token是有限制时间的,默认为24小时,在Master上也可以自己创建token,执行
kubeadm token create
b. 创建好token后,可以执行如下命令查看
kubeadm token list
c. 获取ca证书sha256编码hash值,同样在Master执行
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
返回的字符串就是我们要的
d. 执行
kubeadm join 10.21.102.182:6443 --token <token-a> --discovery-token-ca-cert-hash <hash-b>
将Node加入到Mster中,其中10.21.102.182为主节点IP,安装kubernetes没有额外设置的话端口就是6443,<token-a> 需要替换为步骤a中获取到的token,<hash-b>需要替换为步骤b中获得的证书字符串,<>是不需要的,示例如下
kubeadm join 10.21.102.182:6443 --token c0q5x4.2j52bkebwxx5e0s5 --discovery-token-ca-cert-hash sha256:b8c6aafade71657581a729b055502151b274bae169ed86ddfb34f7d10b51acca , 可以在Master上查看,执行kubectl get nodes, 所有节点的状态为Ready则表示成功
6. 安装过程中遇到的部分问题及解决方法
a. 无法访问https://k8s.gcr.io:将代理设置为hk,
b. 提示Port 2379 is in use:关闭系统的etcd服务。这是因为我在安装kubelet kubeadm kubectl之前就把etcd装了,实际上是不需要的。
c. 提示/var/lib/etcd is not empty:将/var/lib/etcd文件清空
d. 提示detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".:设置为Docker cgroup driver为systemd,创建/etc/docker/daemon.json文件并添加如下内容
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
设置完后需要重启docker。
· e. NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized:这是由于kubelet配置了network-plugin=cni,但是还没安装,所以状态会是NotReady,