前言
这里我用了三台机器,一台master,两台node,先从小的开始吧,一步一步的搭建熟悉之后,我们再来搭建高可用的kubernetes架构。Master和Node上都需要安装docker服务
架构图
实验环境:
1 | Centos7.2 minimal 64位 |
服务器IP:
1 | Master: 192.168.1.89 |
主机名:
1 | Master: master |
软件版本:
1 | k8s组件版本:v1.11.3 |
Master节点要安装的组件有:
1 | 1、docker |
Node节点要安装的组件有:
1 | 1、Calico/Flannel/Open vSwitch/Romana/Weave等等(网络解决方案,k8s有好几个网络解决方案) |
网上有说要关闭swap分区的操作,否则报错,由于我的主机没有设置swap分区,我也不清楚如果不关闭swap会不会报错,所以这里我就不写上关闭swap分区的操作了
A、Master部署
一、环境准备
环境准备需要master和node都操作
1、设置主机名
master上操作:
1 | hostnamectl set-hostname master |
node上操作:
1 | hostnamectl set-hostname node |
node1上操作:
1 | hostnamectl set-hostname node1 |
2、设置hosts
master和node同样的操作
1 | echo "192.168.1.89 master" >> /etc/hosts |
3、设置时间同步
master和node同样的操作
1 | yum -y install ntp |
二、生成证书
(一)安全模式
Kubernetes主要有两种安全模式选择,官方说明地址:
1 | https://kubernetes.io/docs/setup/scratch/#security-models |
1、使用http访问apiserver
1 | 1)使用防火墙来提高安全性 |
2、使用https访问apiserver
1 | 1)使用带有证书的https和用户凭据 |
为了保证线上集群的信任和数据安全,节点之间使用TLS证书来互相通信,如果需要使用https方法,则需要准备证书和用户凭据
(二)证书
生成证书有几种方式:
1 | 1、easyrsa |
官方说明地址:
1 | https://kubernetes.io/docs/concepts/cluster-administration/certificates/ |
使用证书的组件如下:
1 | 1、etcd #使用ca.pem、etcd-key.pem、etcd.pem |
(三)安装证书生成工具cfssl
上边给出了官方的安装地址,你也可以选择别的工具,这里我选择cfssl
注意:
证书生成都在master上执行,证书只需要创建一次即可,以后在向集群中添加新节点时只要将/etc/kubernetes/目录下的证书拷贝到新节点上就行。
下载、解压并准备命令行工具
1 | curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl |
(四)创建CA根证书和密钥
1、创建目录来保存证书文件
1 | mkdir -p /root/ssl |
2、生成默认的cfssl配置文件
1 | cd /root/ssl |
1 | [root@master ssl]# ll |
3、根据上边生成的config.json文件的格式创建用于生成CA证书的ca-config.json文件
(有效期我设置了87600h,10年)
1 | vim ca-config.json |
1 | { |
参数说明:
1 | 1)ca-config.json:可以定义多个profiles,分别制定不同的过期时间、使用场景等参数,后续在签名证书时使用某个peofile |
4、创建CA证书签发请求ca-csr.json文件
1 | vim ca-csr.json |
1 | { |
5、生成CA密钥(ca-key.pem)和证书(ca.pem)
1 | cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
1 | [root@master ssl]# ll ca* |
(五)创建kube-apiserver证书和密钥
1、创建kube-apiserver证书签发请求的csr文件
1 | cd /root/ssl/ |
1 | { |
上边的:
1 | localhost字段代表Master_IP |
2、生成kube-apiserver证书和密钥
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver |
1 | [root@master ssl]# ll apiserver* |
(六)创建ETCD证书和密钥
1、创建ETCD证书签发请求的csr文件
1 | cd /root/ssl/ |
1 | { |
2、生成etcd证书和密钥
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd |
1 | [root@master ssl]# ll etcd* |
(七)创建Kubectl证书和密钥
1、创建Kubectl证书签发请求的csr文件
1 | cd /root/ssl/ |
1 | { |
2、生成kubectl证书和密钥
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin |
1 | [root@master ssl]# ll admin* |
(七)创建Kube-proxy证书和密钥
1、创建Kube-proxy证书签发请求的csr文件
1 | cd /root/ssl/ |
1 | { |
2、生成kube-proxy证书和密钥
1 | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes proxy-csr.json | cfssljson -bare proxy |
1 | [root@master ssl]# ll proxy* |
(八)整理证书和密钥文件备用
将生成的证书和密钥文件(后缀为.pem的文件)拷贝到/etc/kubernetes/ssl目录下备用
1 | mkdir -p /etc/kubernetes/ssl |
三、安装Kubectl命令行工具
官方安装文章:
1 | https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-using-curl |
可以按照官方的安装方式,这里我选择直接下载二进制的方式,其实都是一样的,如下
1、下载kubectl二进制包
下载地址:
1 | https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#v1113 |
命令行下载:
1 | wget https://dl.k8s.io/v1.11.3/kubernetes-client-linux-amd64.tar.gz |
2、解包安装
1 | tar -zxvf kubernetes-client-linux-amd64.tar.gz |
四、创建kubectl的kubeconfig文件
为了让kubectl能够查找和访问Kubernetes集群,它需要一个kubeconfig文件,kubeconfig文件用于组织关于集群、用户、命名空间和认证机制的信息。命令行工具kubectl从kubeconfig文件中得到它要选择的集群以及跟集群API Server交互的信息。
官方设置文章:
1 | https://k8smeetup.github.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/ |
官方的文章里是单独创建一个目录,然后写好集群、用户和上下文。下边我是直接用命令生成,生成的配置信息默认保存到~/.kube/config文件中,两种方法达到的效果一样,随你们选择
1、设置集群参数
(–server后边跟的是kube-apiserver的地址和端口,虽然这里我们还没有部署apiserver)
1 | kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://192.168.1.89:6443 |
2、设置客户端认证参数
1 | kubectl config set-credentials admin --client-certificate=/etc/kubernetes/ssl/admin.pem --embed-certs=true --client-key=/etc/kubernetes/ssl/admin-key.pem |
3、设置上下文参数
1 | kubectl config set-context kubernetes --cluster=kubernetes --user=admin |
4、设置默认上下文
1 | kubectl config use-context kubernetes |
5、查看
1 | [root@master ~]# kubectl config view |
1 | apiVersion: v1 |
五、创建TLS Bootstrapping Token
官方地址:
1 | https://kubernetes.io/cn/docs/admin/kubelet-tls-bootstrapping/ |
1、Token可以是任意的包含128bit的字符串,可以使用安全的随机数发生器生成:
1 | cd /root/ |
2、将生成的Token写入到以下文件
1 | vim token.csv |
1 | 76b154e3c04b6a0f926579338b88d177,kubelet-bootstrap,10001,"system:kubelet-bootstrap" |
3、将token.csv复制到/etc/kubernetes/下备用
1 | cp token.csv /etc/kubernetes/ |
如果后续重新生成了Token,则需要:
1 | 1、更新token.csv文件,分发到所有机器 (master和node)的/etc/kubernetes/目录下,分发到node节点上非必需; |
六、创建kubelet bootstrapping的kubeconfig文件
1 | cd /etc/kubernetes/ |
1、设置集群参数
1 | kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://192.168.1.89:6443 --kubeconfig=bootstrap.kubeconfig |
2、设置客户端认证参数(–token参数为上边生成的那一串字符)
1 | kubectl config set-credentials kubelet-bootstrap --token=76b154e3c04b6a0f926579338b88d177 --kubeconfig=bootstrap.kubeconfig |
3、设置上下文参数
1 | kubectl config set-context default --cluster=kubernetes --user=kubelet-bootstrap --kubeconfig=bootstrap.kubeconfig |
4、设置默认上下文
1 | kubectl config use-context default --kubeconfig=bootstrap.kubeconfig |
注意:
1 | 1、--embed-certs 为 true 时表示将 certificate-authority 证书写入到生成的 bootstrap.kubeconfig 文件中; |
七、创建kube-proxy的kubeconfig文件
1 | cd /etc/kubernetes/ |
1、设置集群参数
1 | kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://192.168.1.89:6443 --kubeconfig=kube-proxy.kubeconfig |
2、设置客户端认证参数
1 | kubectl config set-credentials kube-proxy --client-certificate=/etc/kubernetes/ssl/proxy.pem --client-key=/etc/kubernetes/ssl/proxy-key.pem --embed-certs=true --kubeconfig=kube-proxy.kubeconfig |
3、设置上下文参数
1 | kubectl config set-context default --cluster=kubernetes --user=kube-proxy --kubeconfig=kube-proxy.kubeconfig |
4、设置默认上下文
1 | kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig |
注意:
设置集群参数和客户端认证参数时–embed-certs都为true,这会将certificate-authority、client-certificate和client-key指向的证书文件内容写入到生成的kube-proxy.kubeconfig文件中
八、安装ETCD
yum或者二进制包安装都可以,这里我选择二进制包安装的方式,yum安装的话直接yum -y install etcd即可,也可以源码安装,具体可以参考这篇文章
1 | https://blog.csdn.net/varyall/article/details/79128181 |
ETCD官网下载地址:
1 | https://github.com/etcd-io/etcd/releases |
1、把下载好的二进制包上传到服务器
2、解压
1 | tar -zxvf etcd-v3.3.9-linux-amd64.tar.gz |
3、mv到/usr/local/
1 | mv etcd-v3.3.9-linux-amd64 /usr/local/etcd |
4、软链接
1 | ln -s /usr/local/etcd/etcd* /usr/local/bin/ |
5、给执行权限
1 | chmod +x /usr/local/bin/etcd* |
6、查看版本
1 | [root@master ~]# etcd --version |
1 | etcd Version: 3.3.9 |
7、把etcd加入系统服务,开机自启
1 | vim /usr/lib/systemd/system/etcd.service |
1 | [Unit] |
8、创建etcd配置文件
1 | mkdir -p /etc/etcd |
1 | # [member] |
9、启动etcd
1 | systemctl daemon-reload |
10、防火墙开启2379、2380端口
1 | firewall-cmd --add-port=2379/tcp --permanent |
11、检查etcd端口
1 | [root@master ~]# netstat -luntp |
1 | Active Internet connections (only servers) |
12、检查etcd是否可以使用
1 | [root@master ~]# export ETCDCTL_API=3 |
1 | https://192.168.1.89:2379 is healthy: successfully committed proposal: took = 650.006µs |
九、安装docker
这应该是全文最简单的安装步骤了,之前也有写过docker的安装方法,本来不想再叙述的,想了想,还是写一写吧,要不然你们重新去翻一遍之前的文章也不舒服。这里我使用yum安装。
1、安装依赖
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
2、获取docker的yum源
1 | yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
3、列出docker-ce版本
1 | yum list docker-ce --showduplicates | sort -r |
1 | * updates: mirrors.163.com |
4、安装想要的版本
1 | yum -y install docker-ce-18.03.1.ce-1.el7.centos |
5、把root用户加入到docker用户组
1 | gpasswd -a root docker |
6、启动docker
1 | systemctl start docker |
7、开机自启
1 | systemctl enable docker |
十、安装kubernetes
1、下载地址
1 | https://github.com/kubernetes/kubernetes/releases/tag/v1.11.3 |
2、选择CHANGELOG-1.11.md
3、下载
上图中kubernetes.tar.gz内包含了kubernetes的服务程序文件、文档和示例,而kubernetes-src.tar.gz内则包含了全部源代码。这里我选择了下边的Server Binaries中的文件,其中包含了kubernetes需要运行的全部服务程序文件
也可以参考官方的说明来做:
1 | https://kubernetes.io/docs/setup/scratch/#downloading-and-extracting-kubernetes-binaries |
命令行下载:
1 | wget https://dl.k8s.io/v1.11.3/kubernetes-server-linux-amd64.tar.gz |
4、配置kubernetes
1 | tar -zxvf kubernetes-server-linux-amd64.tar.gz |
十一、把kube-apiserver加入系统服务,开机自启
1、创建服务文件,开机自启
1 | vim /usr/lib/systemd/system/kube-apiserver.service |
1 | [Unit] |
2、创建公共配置文件
1 | vim /etc/kubernetes/config |
1 | ### |
把IP地址改为你自己的IP地址,该配置文件同时被kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy使用
3、创建kube-apiserver的配置文件
1 | vim /etc/kubernetes/apiserver |
1 | ### |
把IP地址改为你的,证书和密钥路径改为你的即可
4、启动kube-apiserver
1 | systemctl daemon-reload |
5、防火墙开启8080、6443端口
1 | firewall-cmd --add-port=8080/tcp --permanent |
十二、把kube-controller-manager加入系统服务,开机自启
1、创建服务文件,开机自启
1 | vim /usr/lib/systemd/system/kube-controller-manager.service |
1 | [Unit] |
2、创建kube-controller-manager的配置文件
1 | vim /etc/kubernetes/controller-manager |
1 | ### |
3、启动kube-controller-manager
1 | systemctl daemon-reload |
十三、把kube-scheduler加入系统服务,开机自启
1、创建服务文件,开机自启
1 | vim /usr/lib/systemd/system/kube-scheduler.service |
1 | [Unit] |
2、创建kube-scheduler的配置文件
1 | vim /etc/kubernetes/scheduler |
1 | ### |
3、启动kube-scheduler
1 | systemctl daemon-reload |
提示:kube-apiserver是主要服务,如果apiserver启动失败其它的也会失败
十四、验证Master节点功能
1 | [root@master ~]# kubectl get cs |
1 | NAME STATUS MESSAGE ERROR |
没有异常即为Master节点安装成功!!!!
好了,到此master节点已经全部安装完成,并成功运行,接下来开始到node节点的安装了
B、Node部署
一、复制在Master上分发的证书、密钥、配置文件等等
1、先登录master节点,将之前生成的/root/.kube/config文件复制到/etc/kubernetes/目录下,并命名为kubelet.kubeconfig备用
1 | cp /root/.kube/config /etc/kubernetes/kubelet.kubeconfig |
2、将master节点上的/etc/kubernetes/目录复制到node节点上,目录同样是/etc/kubernetes/
二、Node节点安装docker
1、安装依赖
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
2、获取docker的yum源
1 | yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
3、列出docker-ce版本
1 | yum list docker-ce --showduplicates | sort -r |
1 | * updates: mirrors.163.com |
4、安装想要的版本
1 | yum -y install docker-ce-18.03.1.ce-1.el7.centos |
5、把root用户加入到docker用户组
1 | gpasswd -a root docker |
6、启动docker
1 | systemctl start docker |
7、开机自启
1 | systemctl enable docker |
8、如果要使用flannel网络,在启动docker的时候,需要添加–bip参数,修改docker的systemd启动文件
1 | vim /usr/lib/systemd/system/docker.service |
1 | [Unit] |
三、Node节点安装flannel网络插件
所有的node节点都需要安装网络插件才能让所有的pod加入到同一个局域网中,这里我选择的是flannel网络插件,当然,你们也可以选择别的插件,去官网学习学习就可以
建议直接使用yum安装flannel,默认安装的版本的是0.7.1的,除非对版本有特殊需求,可以二进制安装,可以参考这篇文章:http://blog.51cto.com/tryingstuff/2121707
1 | [root@node ~]# yum list flannel | sort -r |
1 | * updates: mirrors.cn99.com |
1、安装flannel
1 | yum -y install flannel |
2、修改服务启动文件
1 | vim /usr/lib/systemd/system/flanneld.service |
1 | [Unit] |
参数说明:
1 | 1)Flannel网络必须在宿主机网络能对外(其它node节点)正常通信的情况下启动才有意义,所以这里定义 After=network.target |
3、修改配置文件
1 | vim /etc/sysconfig/flanneld |
1 | # Flanneld configuration options |
4、在etcd中创建网络配置(我们的etcd是在master节点上,所以这里要去master节点执行命令)
1 | etcdctl --endpoints=https://192.168.1.89:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/etcd.pem --key-file=/etc/kubernetes/ssl/etcd-key.pem mkdir /kube-centos/network |
1 | etcdctl --endpoints=https://192.168.1.89:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/etcd.pem --key-file=/etc/kubernetes/ssl/etcd-key.pem mk /kube-centos/network/config '{"Network":"192.168.0.0/16","SubnetLen":24,"Backend":{"Type":"host-gw"}}' |
5、在node节点上启动flannel
1 | systemctl daemon-reload |
6、重启node节点上的docker
1 | systemctl restart docker |
四、查看etcd中的flannel内容
1 | [root@master ~]# etcdctl --endpoints=https://192.168.1.89:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/etcd.pem --key-file=/etc/kubernetes/ssl/etcd-key.pem ls /kube-centos/network/subnets |
1 | /kube-centos/network/subnets/192.168.23.0-24 |
1 | [root@master ~]# etcdctl --endpoints=https://192.168.1.89:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/etcd.pem --key-file=/etc/kubernetes/ssl/etcd-key.pem get /kube-centos/network/config |
1 | {"Network":"192.168.0.0/16","SubnetLen":24,"Backend":{"Type":"host-gw"}} |
1 | [root@master ~]# etcdctl --endpoints=https://192.168.1.89:2379 --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/etcd.pem --key-file=/etc/kubernetes/ssl/etcd-key.pem get /kube-centos/network/subnets/192.168.23.0-24 |
1 | {"PublicIP":"192.168.1.90","BackendType":"host-gw"} |
注意:每台node节点上都要安装flannel,master节点上可以不装
五、Node节点安装kubelet
1、下载Kubernetes版本的二进制包
之前我们已经下载过kubernetes-server-linux-amd64.tar.gz这个包,这个包里包含了所有Kubernetes需要运行的组件,我们把这个包上传到服务器,安装我们需要的组件即可
2、解包安装
1 | tar -zxvf kubernetes-server-linux-amd64.tar.gz |
3、创建kubelet的service启动文件
1 | vim /usr/lib/systemd/system/kubelet.service |
1 | [Unit] |
4、创建kubelet的配置文件
1 | vim /etc/kubernetes/kubelet |
1 | ### |
5、启动kubelet
1 | systemctl daemon-reload |
6、防火墙开启10250端口
1 | firewall-cmd --add-port=10250/tcp --permanent |
六、Node节点安装kube-proxy
1、创建软链接
上一步已经解包安装了所有文件,这里做好软链接即可
1 | ln -s /usr/local/kubernetes/server/bin/kube-proxy /usr/bin/ |
2、创建kube-proxy的service启动文件
1 | vim /usr/lib/systemd/system/kube-proxy.service |
1 | [Unit] |
3、创建kube-proxy的配置文件
1 | vim /etc/kubernetes/proxy |
1 | ### |
4、启动kube-proxy
1 | systemctl daemon-reload |
C、Node1部署
这里省略了,如果需要创建多个node节点,直接按照上面的Node部署流程重复即可
D、验证
1、到master节点上验证安装好的两个node节点
1 | [root@master ~]# kubectl get nodes |
1 | NAME STATUS ROLES AGE VERSION |
状态为Ready即为节点加入成功!!
2、创建一个nginx的service试一下集群的功能是否可用
1 | # kubectl run nginx --replicas=2 --labels="run=load-balancer-example" --image=nginx --port=80 |
1 | deployment.apps/nginx created |
1 | # kubectl expose deployment nginx --type=NodePort --name=examples-service |
1 | service/examples-service exposed |
1 | # kubectl describe svc examples-service |
1 | Name: examples-service |
访问任何一个Node节点的IP+端口,都可以访问到这个nginx的页面
3、删除一个pod,看看会不会自动创建新的pod以保证集群的高可用
查看现有pod
1 | kubectl get pod |
1 | NAME READY STATUS RESTARTS AGE |
删除其中一个
1 | kubectl delete pod nginx-8f8f7665f-ffvsm |
1 | pod "nginx-8f8f7665f-ffvsm" deleted |
再次来查看
1 | kubectl get pod |
1 | NAME READY STATUS RESTARTS AGE |
可以看到,还是两个在Running,只不过NAME已经改变了,这期间,我们一直访问nginx页面是没有任何错误提示的。