腾讯云环境K8S安装及配置测试

腾讯云环境K8S安装及配置测试

文章目录

1. k8s集群系统规划

1.1. kubernetes 1.10的依赖

k8s V1.10对一些相关的软件包,如etcd,docker并不是全版本支持或全版本测试,建议的版本如下:

  • docker: 1.11.2 to 1.13.1 and 17.03.x
  • etcd: 3.1.12
  • 全部信息如下:

参考:External Dependencies
* The supported etcd server version is 3.1.12, as compared to 3.0.17 in v1.9 (#60988)
* The validated docker versions are the same as for v1.9: 1.11.2 to 1.13.1 and 17.03.x (ref)
* The Go version is go1.9.3, as compared to go1.9.2 in v1.9. (#59012)
* The minimum supported go is the same as for v1.9: go1.9.1. (#55301)
* CNI is the same as v1.9: v0.6.0 (#51250)
* CSI is updated to 0.2.0 as compared to 0.1.0 in v1.9. (#60736)
* The dashboard add-on has been updated to v1.8.3, as compared to 1.8.0 in v1.9. (#57326)
* Heapster has is the same as v1.9: v1.5.0. It will be upgraded in v1.11. (ref)
* Cluster Autoscaler has been updated to v1.2.0. (#60842, @mwielgus)
* Updates kube-dns to v1.14.8 (#57918, @rramkumar1)
* Influxdb is unchanged from v1.9: v1.3.3 (#53319)
* Grafana is unchanged from v1.9: v4.4.3 (#53319)
* CAdvisor is v0.29.1 (#60867)
* fluentd-gcp-scaler is v0.3.0 (#61269)
* Updated fluentd in fluentd-es-image to fluentd v1.1.0 (#58525, @monotek)
* fluentd-elasticsearch is v2.0.4 (#58525)
* Updated fluentd-gcp to v3.0.0. (#60722)
* Ingress glbc is v1.0.0 (#61302)
* OIDC authentication is coreos/go-oidc v2 (#58544)
* Updated fluentd-gcp updated to v2.0.11. (#56927, @x13n)
* Calico has been updated to v2.6.7 (#59130, @caseydavenport)
*

1.2 测试服务器准备及环境规划

服务器名 IP 功 能 安装服务
sh-saas-cvmk8s-master-01 10.12.96.3 master master,etcd
sh-saas-cvmk8s-master-02 10.12.96.5 master master,etcd
sh-saas-cvmk8s-master-03 10.12.96.13 master master,etcd
sh-saas-cvmk8s-node-01 10.12.96.2 node node
sh-saas-cvmk8s-node-02 10.12.96.4 node node
sh-saas-cvmk8s-node-03 10.12.96.6 node node
bs-ops-test-docker-dev-04 172.21.248.242 私有镜像仓库 harbor
VIP 10.12.96.100 master vip netmask:255.255.255.0

netmask都为:255.255.255.0

所有的测试服务器安装centos linux 7.4最新版本.

VIP:10.12.96.100只是用于keepalived的测试,实际本文使用的是腾讯云LB+haproxy的模式,使用的腾讯云LB VIP为:10.12.16.101

容器网段:10.254.0.0/16
容器网段需要避免这些冲突:

  • 同vpc的其它集群的集群网络cidr
  • 所在vpc的cidr
  • 所在vpc的子网路由的cidr
  • route-ctl list 能看到的所有route table 的 cidr
    容器网段不要在VPC内创建,也要不在VPC的路由表内,使用一个VPC内不存在的网络。

k8s service cluster网络:10.254.255.0/24

1.3 云扩展控制器tencentcloud-cloud-controller-manager

本次测试使用腾讯云主机CVM,网络使用VPC,其中k8s master及node在一个子网:10.12.96.0/24。

tencentcloud-cloud-controller-manager为腾讯云推出的k8s云扩展控制器,网址为:https://github.com/dbdd4us/tencentcloud-cloud-controller-manager

tencentcloud-cloud-controller-manager配置说明参考:https://github.com/dbdd4us/tencentcloud-cloud-controller-manager/blob/master/README_zhCN.md

tencentcloud-cloud-controller-manager在当前版本主要是解决了K8S上的容器可以直接使用VPC网络的问题,使得VPC内其它CVM主机可直接访问K8S内的容器。

tencentcloud-cloud-controller-manager对K8S及相关资源的要求如下:

  • k8s node名必须为ip
  • 需访问api server为非https地址
  • 容器网段需用route-ctl创建,而不是在腾讯云控制台,不过创建完后,应该要在腾讯云VPC内看到辅助网段。
  • kubernets 1.10.x以上
  • Docker 1.7.06以上

2. k8s集群安装前的准备工作

2.1 操作系统环境配置

在所有的服务器上操作:

  • 修改主机名

以上只修改了一台服务器,在其它服务器上执行相应的操作修改主机名。

  • 关闭防火墙

  • 关闭Swap

  • 关闭SELinux

  • 开启网桥转发

  • 配置K8S的yum源

  • 安装依赖包

  • 安装bash命令提示

  • 配置ntp

腾讯云由于原生已带有ntpd服务,此步略过。

  • 调整文件打开数等配置

2.2 安装docker

在所有node节点上安装docker17.06,注意:k8s v1.10经过测试的最高docker版本为17.03.x,不建议用其它版本。但是腾讯云需要17.05以上版本,所以我们使用17.06.x的版本。

2.3 安装harbor私有镜像仓库

以下操作只需要172.21.248.242服务器上执行:

  • harbor的管理界面为:http://172.21.248.242

用户名:admin
密码:Harbor12345

  • 上传下拉镜像测试:
    在其它机器上:

输入用户名和密码即可登入。

  • 从网方镜像库下载一个centos的镜像并推送到私有仓库:

在web界面上就可以看到镜像了

  • 拉镜像:

3. 安装及配置etcd

3.1 创建etcd证书

以下操作在sh-saas-cvmk8s-master-01上执行即可:

3.1.1 设置cfssl环境

3.1.2 创建 CA 配置文件

下面证书内配置的IP为etcd节点的IP,为方便以后扩容,可考虑多配置几个预留IP地址,如考虑以后需要使用域名,可把域名也配置上去:

3.1.3 把证书复制到另外2个etcd节点上

3.2 安装etcd

k8s v1.10测试的是etcd 3.1.12的版本,所以我们也使用这个版本,发现这个版本在YUM源上没有,只能下载二进制包安装了。
以下操作需在3台etcd节点(也就是master)节点上执行:

在三个etcd节点的服务都起来后,执行一下命令检查状态,如果像以下输出,说明配置成功。

4. master节点负载均衡配置

k8s master 的api server需要做负载均衡,否则会存在单点问题,在腾讯云上做负载均衡可以使用弹性IP加keepalived的方式,也可以使用腾讯云LB+haproxy的方式。

4.1 使用keepalived方式

我只测试了手动绑LB到其中一台master节点,配置keepalived,生产使用建议参考7.5,使VIP在故障时可以动态绑定。

4.1.1 安装keepalived

在3台master节点上安装keepalived:

4.1.2 配置keepalived

  • 在sh-saas-cvmk8s-master-01上生成配置文件

  • 在sh-saas-cvmk8s-master-02上生成配置文件

  • 在sh-saas-cvmk8s-master-03上生成配置文件

4.1.3 启动验证keepalived

可以看到VIP 10.12.96.100在sh-saas-cvmk8s-master-01上。
把sh-saas-cvmk8s-master-01关机,可以看到VIP到了sh-saas-cvmk8s-master-02上。

4.2 使用腾讯云LB+haproxy方式

腾讯云的LB有一个问题,当LB后端的真实服务器访问LB的VIP地址时,是不通的。
所以我们需要另外找2台服务器安装haproxy,然后把这2台服务器加入到腾讯云的LB。并在腾讯云LB上配置k8s api server TCP安全端口 6443端口及TCP非安全端口 8088监听(如果tencentcloud-cloud-controller-manager使用ServiceAccount方式,可不启用非安全端口监听)。
以下是在2台服务器上安装及配置haproxy的步骤:

5. 使用kubeadm安装及配置k8s集群

5.1 下载官方镜像

由于官方镜像在国内访问非常慢或不能访问,所以先把镜像拉到私有仓库:

5.2 安装kubelet kubeadm kubectl

在所有节点上安装:

所有节点修改kubelet配置文件
kubelet配置文件在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf内
可通过新建一个/etc/systemd/system/kubelet.service.d/20-kubeadm.conf配置文件覆盖老的配置
kubeadm默认只支持cni网络,不支持kubenet,但是腾讯CCM需要kubenet,所以在这里配置成kubenet。
–hostname-override=10.12.96.3每台机器都修改成自己的IP

让配置生效:

启用命令行自动补全:

5.3 通过kubeadm配置集群

5.3.1 生成kubeadm配置文件

在master节点sh-saas-cvmk8s-master-01,sh-saas-cvmk8s-master-02,sh-saas-cvmk8s-master-03上生成kubeadm配置文件:

注意:

  • token 可使用 kubeadm token generate生成并各节点保持一致。
  • sh-saas-cvmk8s-master-04,sh-saas-cvmk8s-master-05,10.12.96.10,10.12.96.11为预留后期扩容master的节点
  • 当tencentcloud-cloud-controller-manager使用非https接口与k8s api server通讯时,需增加insecure-bind-address及insecure-port参数
  • nodeName需改成本机IP,tencentcloud-cloud-controller-manager要求节点名为IP地址
  • advertiseAddress需改成本机IP,controlPlaneEndpoint参数为VIP的IP+端口

5.3.2 在sh-saas-cvmk8s-master-01上初始化集群

按照提示,执行以下命令后,kubectl就可以直接运行了。

如果有问题,可以通过kubeadm reset重置到初始状态,然后再重新初始化

如果没有报错,可以看到以下信息:

5.3.3 其它二台master节点初始化

先把刚刚在master节点上生成的证书分发到其它的master节点,node节点不需要.

在其它二台master节点上初始化,注意kubeadm配置文件内nodeName需改成本机IP,tencentcloud-cloud-controller-manager要求节点名为IP地址:

我们可以发现生成的hash值是一样的。

现在查看k8s状态,可以看到有3个master节点了,而除coredns外,所有的容器比刚刚都多了2个,coredns本来就有2个。

PS:默认master不运行pod,通过以下命令可让master也运行pod,生产环境不建议这样使用。

5.3.4 node节点加入集群

在3台 node节点上,执行以下命令加入集群:

可以看到3个node节点已经加入到集群内了。

但是容器的IP都是none,coredns也是Pending状态,这是因为tencent cloud controller manager没有部署,网络还不通造成的。

5.4 部署tencent cloud controller manager

5.4.1 编译安装tencent cloud controller manager

只需要一台机器上执行:

5.4.2 创建路由表

参考:https://github.com/dbdd4us/tencentcloud-cloud-controller-manager/blob/master/route-ctl/README.md
10.254.0.0/16这个容器网段需要避免这些冲突:

  • 同vpc的其它集群的集群网络cidr
  • 所在vpc的cidr
  • 所在vpc的子网路由的cidr
  • route-ctl list 能看到的所有route table 的 cidr

配置route-ctl所需的环境变量并创建路由:

5.4.3 创建tencent-cloud-controller-manager configmap

5.4.4 创建tencent-cloud-controller-manager Deployment

tencent-cloud-controller-manager可以使用http或https两种方式与k8s master api server交互。

生产环境建议使用https方式,可通过配置serviceAccount来使用,更加安全。同时关闭api server的非安全端口。
kubeadm配置文件内更改以下两个参数可以关闭api server的非安全端口:

5.4.4.1 tencent-cloud-controller-manager http方式部署

5.4.4.2 tencent-cloud-controller-manager https方式部署

过个一两分钟后,我们可以看到coredns pods都成Running状态,容器的IP也都有了。

5.4.5 容器内通信测试

通过下面的命令可进入容器,通过ping其它节点上的容器IP,以及公网IP、容器外的测试机IP等。发现都已经连通。

6. 其它kubernetes-dashboard等插件的安装及配置

6.1 kubernetes-dashboard

kubernetes 1.10测试过的版本为:v1.8.3

访问方式为:https://10.12.16.101:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/,打开后就报错了。