一、准备工作

1.1 操作系统版本

CentOS Linux release 7.6.1810 (Core)

1.2 节点信息

节点名称

ip

安装组件

node1

192.168.1.156

etcd, docker, k8s

node2

192.168.1.167

etcd, docker, k8s

node3

192.168.1.168

etcd, docker, k8s

nginx

192.168.1.178

nginx

 

1.3 软件版本

  • rancher-2.3.3
  • kubernetes-1.13.5
  • rke-v0.2.2
  • kubectl-v1.13.5
  • helm-v2.13.1
  • tiller-v2.13.1

1.4 软件准备

本次部署的包都放在百度网盘,下载之后部署,以保证部署过程的流畅。

链接:https://pan.baidu.com/s/1vIOU3LPRcCNyfxam4j7Y9g提取码:zwuj

1.5 架构示意图

怎么在rancher工作负载里添加容器启动成功后自动执行命令 rancher 容器编排_linux

 

 

二、初始化环境

初始化操作在3台node节点都要执行。

2.1 关闭相关服务

1、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

 

2、关闭selinux

$ sudo setenforce 0
$ grep SELINUX /etc/selinux/config
SELINUX=disabled

3、关闭swap

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

 

2.2 设置主机名

1、修改主机名,然后重新登陆

$ sudo hostnamectl set-hostname node1
$ sudo hostnamectl set-hostname node2
$ sudo hostnamectl set-hostname node3

 

2、设置主机名保存在/etc/hosts文件中

$ cat > /etc/hosts << EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.156 node1
192.168.1.167 node2
192.168.1.168 node3
EOF

 

2.3 操作系统内核参数调整

1、修改文件打开数

echo -e  "root soft nofile 65535\nroot hard nofile 65535\n* soft nofile 65535\n* hard nofile 65535\n"     >> /etc/security/limits.conf
sed -i 's#4096#65535#g' /etc/security/limits.d/20-nproc.conf

2、内核其他参数

cat >> /etc/sysctl.conf<<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
vm.swappiness=0
vm.max_map_count=655360
EOF

 

2.4 安装基础软件

yum -y install wget ntpdate lrzsz curl yum-utils device-mapper-persistent-data lvm2 bash-completion && ntpdate -u cn.pool.ntp.org

2.5 创建用户及免密登陆

1、创建用户并添加到docker组

groupadd docker
useradd rancher -G docker
echo "123456" | passwd --stdin rancher

这一步非常重要,如果没有操作,则后边可能会有报错等问题。

2、设置ssh免密登录

node1服务器上执行下面的命令:

su - rancher
ssh-keygen
ssh-copy-id rancher@192.168.1.156
ssh-copy-id rancher@192.168.1.167
ssh-copy-id rancher@192.168.1.168

说明:

通过授权node1主机对三台主机的免密码登陆,为后边安装k8s的步骤做好准备工作。

 

三、部署过程

3.1 安装docker

需要在三台主机上一起安装docker。

rke工具目前只支持docker v17.03.2,请务必保持版本一致,否则后续安装会报错。

1、安装repo源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2、卸载旧docker版本

yum remove -y docker \
              docker-client \
              docker-client-latest \
              docker-common \
              docker-latest \
              docker-latest-logrotate \
              docker-logrotate \
              docker-selinux \
              docker-engine-selinux \
              docker-engine \
              container*

3、安装docker-ce-17.03.2

yum -y install --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos docker-ce-selinux-17.03.2.ce-1.el7.centos

4、启动docker

$ systemctl enable docker
$ systemctl start docker
$ systemctl status docker

 

5、添加国内加速代理

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://kw88y6eh.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.1.153"],
    "storage-driver": "overlay2",
    "storage-opts": [
    "overlay2.override_kernel_check=true"
    ]
}
EOF
  • registry-mirrors:表示公网的加速器地址,可设置多个,地址需要添加协议头(https或者http)
  • insecure-registries:表示内网的私服地址,地址不能添加协议头(http)
  • storage-driver:表示使用OverlayFS的overlay2存储驱动。

 

6、重启docker

systemctl daemon-reload
systemctl restart docker

3.2 安装nginx

在192.168.1.178机器上安装nginx,用于rancher-server负载均衡。

1、安装nginx软件

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx -y
sudo systemctl enable nginx.service

 

2、修改nginx配置文件

user nginx;
worker_processes 4;
worker_rlimit_nofile 40000;
events {
    worker_connections 8192;
}
http {
    # Gzip Settings
    gzip on;
    gzip_disable "msie6";
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_vary on;
    gzip_static on;
    gzip_proxied any;
    gzip_min_length 0;
    gzip_comp_level 8;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml application/font-woff text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobjectfont/woff2 image/x-icon image/png image/jpeg;
    server {
        listen         80;
        return 301 https://$host$request_uri;
    }
}
stream {
    upstream rancher_servers {
        least_conn;
        server 192.168.1.156:443 max_fails=3 fail_timeout=5s;
        server 192.168.1.167:443 max_fails=3 fail_timeout=5s;
        server 192.168.1.168:443 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     443;
        proxy_pass rancher_servers;
    }
}

 

3、启动nginx

sudo systemctl restart nginx.service

 

3.3 Rancher集群部署

3.3.1、安装必要工具

以下操作只在192.168.1.156(即node1节点)上执行即可。

1、安装rke

su -  root
wget https://www.cnrancher.com/download/rke/rke_linux-amd64
chmod +x rke_linux-amd64
mv rke_linux-amd64 /usr/bin/rke

2、安装kubectl

wget https://www.cnrancher.com/download/kubectl/kubectl_amd64-linux
chmod +x kubectl_amd64-linux
mv kubectl_amd64-linux /usr/bin/kubectl

 

3、安装helm

wget https://www.cnrancher.com/download/helm/helm-linux.tar.gz
tar xf helm-linux.tar.gz
mv linux-amd64/helm /usr/bin/helm
mv linux-amd64/tiller /usr/bin/tiller
rm -rf helm-linux.tar.gz linux-amd64/

其他工具下载地址:

https://www.cnrancher.com/docs/rancher/v2.x/cn/install-prepare/download/

 

3.3.2 安装k8s

1、切换到rancher用户

su - rancher

注意:必须使用普通用户操作,否则后边的操作会报下面的错误

Please check if the configured user can execute `docker ps` on the node, and if the SSH server version is at least version 6.7 or higher. If youare using RedHat/CentOS, you can't use the user `root`. Please refer to the documentation for more instructions. Error: ssh: rejected: administratively prohibited (open failed)

2、创建rancher集群配置文件

cat > rancher-cluster.yml << EOF
nodes:
  - address: 192.168.1.156
    user: rancher
    role: [controlplane,worker,etcd]
  - address: 192.168.1.167
    user: rancher
    role: [controlplane,worker,etcd]
  - address: 192.168.1.168
    user: rancher
    role: [controlplane,worker,etcd]
services:
  etcd:
    snapshot: true
    creation: 6h
    retention: 24h
EOF

参数说明:

  • address:公共域名或IP地址
  • user:可以运行docker命令的用户,需要是普通用户。
  • role:分配给节点的Kubernetes角色列表
  • ssh_key_path:用于对节点进行身份验证的SSH私钥的路径(默认为~/.ssh/id_rsa)

 

3、启动集群

$ rke up --config ./rancher-cluster.yml

完成后,它应显示:Finished building Kubernetes cluster successfully。并且已经创建了一个文件kube_config_rancher-cluster.yml。这个文件包含kubectl和helm访问K8S的凭据。

4、配置环境变量

切找到root用户

su - root
vi /etc/profile
export KUBECONFIG=/home/rancher/kube_config_rancher-cluster.yml

保存,并执行使配置生效:

source /etc/profile

保存kube_config_rancher-cluster.ymlrancher-cluster.yml文件的副本,后期维护和升级Rancher实例时将会用到。

 

5、通过kubectl测试您的连接,并查看您的所有节点是否处于Ready状态

先配置一下kubectl的命令补全功能。

$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ source ~/.bashrc
$ su - rancher
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ source ~/.bashrc

然后查看节点状态

[root@node1 ~]$ su - rancher
[rancher@node1 ~]$ kubectl get node
NAME            STATUS   ROLES                      AGE   VERSION
192.168.111.3   Ready    controlplane,etcd,worker   10m   v1.13.5
192.168.111.4   Ready    controlplane,etcd,worker   10m   v1.13.5
192.168.111.5   Ready    controlplane,etcd,worker   10m   v1.13.5

由于需要联网下载docker镜像文件,所以需要一段时间才能安装好,10-30分钟左右。

 

6、检查集群Pod的运行状况

[rancher@node1 ~]$ kubectl get pods --all-namespaces
NAMESPACE       NAME                                      READY   STATUS      RESTARTS   AGE
ingress-nginx   default-http-backend-78fccfc5d9-j8v5h     1/1     Running     0          9m45s
ingress-nginx   nginx-ingress-controller-cpb9t            1/1     Running     0          9m16s
ingress-nginx   nginx-ingress-controller-fzcdl            1/1     Running     0          9m16s
ingress-nginx   nginx-ingress-controller-n2f5b            1/1     Running     0          9m36s
kube-system     canal-9vzxn                               2/2     Running     0          9m59s
kube-system     canal-p8t59                               2/2     Running     0          9m59s
kube-system     canal-v8nhz                               2/2     Running     0          9m59s
kube-system     kube-dns-58bd5b8dd7-dp8nk                 3/3     Running     0          9m55s
kube-system     kube-dns-autoscaler-77bc5fd84-t2jht       1/1     Running     0          9m54s
kube-system     metrics-server-58bd5dd8d7-pr6nh           1/1     Running     0          9m50s
kube-system     rke-ingress-controller-deploy-job-qh82s   0/1     Completed   0          9m46s
kube-system     rke-kube-dns-addon-deploy-job-g95sp       0/1     Completed   0          9m56s
kube-system     rke-metrics-addon-deploy-job-mmk57        0/1     Completed   0          9m51s
kube-system     rke-network-plugin-deploy-job-b75ds       0/1     Completed   0          10m

保存kube_config_rancher-cluster.yml和rancher-cluster.yml文件的副本,以后将需要这些文件来维护和升级Rancher实例。

 

3.3.3 Helm

Helm有两个部分:Helm客户端(helm)和Helm服务端(Tiller)。

使用Helm在集群上安装tiller服务以管理charts,由于RKE默认启用RBAC, 因此我们需要使用kubectl来创建一个serviceaccount,clusterrolebinding才能让tiller具有部署到集群的权限。

1、在kube-system命名空间中创建ServiceAccount:

kubectl -n kube-system create serviceaccount tiller

2、创建ClusterRoleBinding以授予tiller帐户对集群的访问权限:

kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller

3、安装Helm Server(Tiller)

helm init --service-account tiller   --tiller-image registry.cn-hangzhou.aliyuncs.com/eryajf/tiller:v2.13.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

4、安装Tiller金丝雀版本

helm init --service-account tiller --canary-image

需要修改成国内镜像(可能需要delete再重新init)

kubectl --namespace=kube-system set image deployments/tiller-deploy tiller=registry.cn-hangzhou.aliyuncs.com/eryajf/tiller:v2.13.1

3.3.4 helm安装rancher

1、添加Chart仓库地址

使用helm repo add命令添加Rancher chart仓库地址,访问Rancher tag和Chart版本替换为您要使用的Helm仓库分支(即latest或stable)。

helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

2、安装证书管理器

  • 1、只有Rancher自动生成的证书和LetsEncrypt颁发的证书才需要cert-manager。如果是你自己的证书,可使用ingress.tls.source=secret参数指定证书,并跳过此步骤。
helm install stable/cert-manager \
  --name cert-manager \
  --namespace kube-system
  • 2、Rancher自动生成证书

默认情况下,Rancher会自动生成CA根证书并使用cert-manager颁发证书以访问Rancher server界面。

唯一的要求是将hostname配置为访问Rancher的域名地址,使用这种SSL证书配置方式需提前安装证书管理器。

helm install rancher-stable/rancher \
  --name rancher \
  --namespace cattle-system \
  --set hostname=rancher.com

rancher.com就是后面访问rancher的域名,需要在/etc/hosts文件中添加关联(所有主机):

[root@node1 ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts
[root@node2 ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts
[root@node3 ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts
[root@nginx ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts

由于我们通过hosts文件来添加映射,所以需要为Agent Pod添加主机别名(/etc/hosts):

kubectl -n cattle-system patch  deployments cattle-cluster-agent --patch '{
    "spec": {
        "template": {
            "spec": {
                "hostAliases": [
                    {
                        "hostnames":
                        [
                            "rancher.com"
                        ],
                            "ip": "192.168.1.178"
                    }
                ]
            }
        }
    }
}'

这一步如果马上执行,可能会报错:Error from server (NotFound): deployments.extensions "cattle-cluster-agent" not found,这个deployment是上一步install时创建的,比较慢,耐心等待一下,这个时候也可以先跳过这里,去到后边,简单配置一下,访问一下rancher的界面。

kubectl -n cattle-system patch  daemonsets cattle-node-agent --patch '{
    "spec": {
        "template": {
            "spec": {
                "hostAliases": [
                    {
                        "hostnames":
                        [
                            "rancher.com"
                        ],
                            "ip": "192.168.1.178"
                    }
                ]
            }
        }
    }
}'

3.3.5 登录rancher管理端

  • 1、同样将刚刚的域名映射关系写入到Windows主机的hosts文件。
192.168.1.178 rancher.com

怎么在rancher工作负载里添加容器启动成功后自动执行命令 rancher 容器编排_docker_02

输入:admin/admin,进入首页界面。

怎么在rancher工作负载里添加容器启动成功后自动执行命令 rancher 容器编排_nginx_03

报这个问题的原因就是刚刚创建的cattle-cluster-agent还没有被创建成功,同样耐心等待即可。这个时候可以随便点点看看先。这个过程与自己的网络有关,这时也可以在node1主机上,通过如下命令进行一个监控。

[rancher@node1 ~]$ kubectl get -n cattle-system pod -w
NAME                     READY   STATUS    RESTARTS   AGE
rancher-bdf49fb9-7qhgp   1/1     Running   1          12m
rancher-bdf49fb9-hf6tm   1/1     Running   0          12m
rancher-bdf49fb9-xmbv7   1/1     Running   1          12m
cattle-cluster-agent-7b54db4bc8-r4blg   0/1   Pending   0     0s
cattle-cluster-agent-7b54db4bc8-r4blg   0/1   Pending   0     0s
cattle-cluster-agent-7b54db4bc8-r4blg   0/1   ContainerCreating   0     0s
cattle-node-agent-mskmb   0/1   Pending   0     0s
cattle-node-agent-2cmww   0/1   Pending   0     0s
cattle-node-agent-kkpvn   0/1   Pending   0     0s
cattle-node-agent-mskmb   0/1   ContainerCreating   0     0s
cattle-node-agent-kkpvn   0/1   ContainerCreating   0     0s
cattle-node-agent-2cmww   0/1   ContainerCreating   0     0s

在我这里,等了十分钟左右,才开始正式的部署。这个时候,可以返回到上边,将那两条命令导入进去。操作之后,然后再看rancher,就不会报连接问题了。

到这里,基本上安装步骤也就完成了。

怎么在rancher工作负载里添加容器启动成功后自动执行命令 rancher 容器编排_docker_04

 

 

四、高可用测试

1、关闭node1节点

[root@node1 ~]# init 0

2、观察rancher的访问从下图所我们可以看到,rancher依然可以正常访问,从而实现高可用目的。

怎么在rancher工作负载里添加容器启动成功后自动执行命令 rancher 容器编排_linux_05

怎么在rancher工作负载里添加容器启动成功后自动执行命令 rancher 容器编排_docker_06

 

 

 

五、排错

1、在执行rke up --config ./rancher-cluster.yml报认证失败

怎么在rancher工作负载里添加容器启动成功后自动执行命令 rancher 容器编排_linux_07

 

解决方法:

docker stop $(docker ps -aq)
docker system prune -f
docker volume rm $(docker volume ls -q)
docker image rm $(docker image ls -q)
rm -rf /etc/ceph \
       /etc/cni \
       /etc/kubernetes \
       /opt/cni \
       /opt/rke \
       /run/secrets/kubernetes.io \
       /run/calico \
       /run/flannel \
       /var/lib/calico \
       /var/lib/etcd \
       /var/lib/cni \
       /var/lib/kubelet \
       /var/lib/rancher/rke/log \
       /var/log/containers \
       /var/log/pods \
       /var/run/calico