一、前期准备

1、主机环境

节点名称

IP地址

系统

安装组件

nginx

192.168.0.100

CentOS7.2

nginx

node1

192.168.0.101

CentOS7.2

etcd,docker,k8s

node2

192.168.0.102

CentOS7.2

etcd,docker,k8s

node3

192.168.0.103

CentOS7.2

etcd,docker,k8s

2、软件版本

rancher-2.3.5
kubernetes-1.17.2
rke-1.0.4
kubectl-1.17.2
helm-3.0.3
docker-18.09.9

这里要特别提说一下,helm这里我用的是3.x版本。关于Helm3和Helm2的区别可以参考 你不得不了解Helm 3中的5个关键新特性

3、安装方法介绍

1)RKE HA安装

2)Helm HA安装


因为RKE HA安装仅支持Rancher-v2.0.8以及早期的版本,这种方式已经弃用。
Rancher-v2.0.8以后的版本,欢迎您采用Helm chart方式部署Rancher HA。
所以这里采用Helm chart方式安装。

4、推荐的架构

  • Rancher的DNS应解析为第4层负载均衡器
  • Load Balancer应将端口TCP/80和TCP/443转发到Kubernetes集群中的所有节点IP上。
  • Ingress控制器将HTTP重定向到HTTPS,并将作为端口TCP/443上的SSL/TLS终止。
  • Ingress控制器将流量转发到Rancher pod的TCP/80端口。

rancher怎么命令行改镜像 rancher使用_docker

二、环境初始化

主机初始化,三台node上都要执行

1、主机名等设置

  • 设置永久主机名,然后重新登录
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# hostnamectl set-hostname node2
[root@localhost ~]# hostnamectl set-hostname node3
  • 在/etc/hosts中设置主机名解析
[root@node1 ~]# cat >> /etc/hosts << EOF
192.168.0.101 node1
192.168.0.102 node2
192.168.0.103 node3
EOF

2、关闭相关服务

  • 关闭selinux
[root@node1 ~]# setenforce 0
[root@node1 ~]# vim /etc/sysconfig/selinux 
SELINUX=disabled #修改为disabled
  • 关闭防火墙
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
  • 关闭swap
[root@node1 ~]# swapoff -a

为了防止系统重启之后/etc/fstab的重新挂载,也要将/etc/fstab中的swap分区给注释了。

[root@node1 ~]# vim /etc/fstab

# swap行

3、设置内核参数

[root@node1 ~]# cat <<EOF >  /etc/sysctl.d/rancher.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.max_map_count = 655360
EOF
  • 使配置生效
[root@k8s-node1 ~]# modprobe br_netfilter
[root@k8s-node1 ~]# sysctl -p /etc/sysctl.d/rancher.conf

4、安装基础软件

[root@node1 ~]# yum -y install vim screen lrzsz tree openssl openssh-clients openssl-devel openssh-server telnet iftop iotop sysstat wget ntpdate dos2unix lsof net-tools mtr gcc gcc-c++ cmake zip unzip git sudo psmisc && /usr/sbin/ntpdate ntp1.aliyun.com &> /dev/null &&  hwclock --systohc &> /dev/null

5、创建用户、免密登录

  • 创建rancher并添加到docker组
[root@node1 ~]# groupadd docker
[root@node1 ~]# useradd rancher -G docker
[root@node1 ~]# echo "123456" | passwd --stdin rancher

ssh免密登录,这一步只需在node1上执行,授权node1可以免密登录到这三台node上,后面安装k8s的时候会用到。

[root@node1 ~]# su - rancher
[rancher@node1 ~]# ssh-keygen
[rancher@node1 ~]# ssh-copy-id rancher@192.168.0.51
[rancher@node1 ~]# ssh-copy-id rancher@192.168.0.52
[rancher@node1 ~]# ssh-copy-id rancher@192.168.0.53

三、安装docker

在三台主机上都执行下面的Docker安装操作

在安装docker之前,要先确定docker的版本,那么怎么来确定呢?

  • 先来看看Rancher-v2.3.5支持的各个软件的版本:

rancher怎么命令行改镜像 rancher使用_rancher怎么命令行改镜像_02

可以看到默认安装的是v1.17.2版本的Kubernetes,
所以我们要选择支持v1.17.2版本Kubernetes的docker版本。
这里选择docker-18.09.9。

1、使用国内yum源

[root@node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@node1 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2、卸载旧版本的docker

  • 如果主机上已经有docker存在且不是想要安装的版本,需要先进行卸载。
[root@node1 ~]# 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、安装Docker18.09版本

[root@node1 ~]# yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7

4、启动docker

[root@node1 ~]# systemctl start docker
[root@node1 ~]# systemctl enable docker
[root@node1 ~]# systemctl status docker

5、优化docker配置

[root@node1 ~]# cat > /etc/docker/daemon.json << EOF
{
  "oom-score-adjust": -1000,
  "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://kw88y6eh.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.0.153"],
    "storage-driver": "overlay2",
    "storage-opts": [
    "overlay2.override_kernel_check=true"
    ]
}
EOF
OOMScoreAdjust=-1000:防止docker服务OOM

registry-mirrors:公网的加速器地址,可以设置多个,地址需要添加协议头(https或者http)

storage-driver:使用OverlayFS的overlay2存储驱动。(OverlayFS是一个新一代的联合文件系统,类似于AUFS,但速度更快,实现更简单。Docker为OverlayFS提供了两个存储驱动程序:旧版的overlay,新版的overlay2(更稳定))

6、重启docker

[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker

四、安装Nginx

# yum install nginx
  • 修改配置文件nginx.conf
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.0.51:443 max_fails=3 fail_timeout=5s;
        server 192.168.0.52:443 max_fails=3 fail_timeout=5s;
        server 192.168.0.53:443 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     443;
        proxy_pass rancher_servers;
    }
}
  • nginx -t报错
  • 启动nginx
[root@nginx~]# systemctl restart nginx.service
[root@nginx~]# systemctl enable nginx.service

五、 Rancher集群部署

以下操作只需在node1上执行

1、安装必备工具

  • 需要以下的CLI工具:
rke - Rancher Kubernetes Engine用于构建Kubernetes集群。
kubectl - Kubernetes命令行工具。
helm - Kubernetes的包管理。
  • 安装rke
#rke下载地址:https://github.com/rancher/rke/tags,下载v1.0.4
[root@node1 ~]# chmod +x rke_linux-amd64 
[root@node1 ~]# mv rke_linux-amd64 /usr/bin/rke
  • 安装kubectl
[root@node1 ~]# wget http://storage.googleapis.com/kubernetes-release/release/v1.17.2/bin/linux/amd64/kubectl
[root@node1 ~]# chmod +x kubectl 
[root@node1 ~]# mv kubectl /usr/bin/kubectl
  • 安装helm
#helm下载地址:https://github.com/helm/helm/tags 下载v3.0.3
[root@node1 ~]# tar -zxf helm-v3.0.3-linux-amd64.tar.gz 
[root@node1 ~]# mv linux-amd64/helm /usr/bin/helm
[root@node1 ~]# rm -rf helm-v3.0.3-linux-amd64.tar.gz linux-amd64

2、安装k8s

1)切换到rancher用户

[root@node1 ~]# su - rancher

这里要注意一下,必须使用普通用户进行操作,否则后边的操作会报错。

2)创建rancher-cluster.yml文件

[rancher@node1 ~]$ cat > rancher-cluster.yml << EOF
nodes:
  - address: 192.168.0.51
    user: rancher
    role: [controlplane,worker,etcd]
  - address: 192.168.0.52
    user: rancher
    role: [controlplane,worker,etcd]
  - address: 192.168.0.53
    user: rancher
    role: [controlplane,worker,etcd]
services:
  etcd:
    snapshot: true
    creation: 6h
    retention: 24h
EOF
  • 常规RKE节点选项

Option

Required

Description

address

yes

公共域名或IP地址

user

yes

可以运行docker命令的用户,需要是普通用户

role

yes

分配给节点的Kubernetes角色列表

ssh_key_path

no

用于对节点进行身份验证的SSH私钥的路径(默认为~/.ssh/id_rsa)

3)创建Kubernetes集群

# 运行RKE命令创建Kubernetes集群

[rancher@node1 ~]$ rke up --config ./rancher-cluster.yml

由于需要下载docker镜像文件,所以需要一段时间才能安装好。
完成后,它应显示Finished building Kubernetes cluster successfully。
并且RKE会自动创建kube_config_rancher-cluster.yml。这个文件包含kebectl和helm访问K8S的凭据。

4)配置环境变量

### 切换到root用户

[rancher@node1 ~]$ su - root
[root@node1 ~]# vim /etc/profile
export KUBECONFIG=/home/rancher/kube_config_rancher-cluster.yml
[root@node1 ~]# source /etc/profile

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

  • 这里先配置下kubectl的命令补全功能。
[root@node1 ~]# yum install -y bash-completion
[root@node1 ~]# source /usr/share/bash-completion/bash_completion
[root@node1 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@node1 ~]# source ~/.bashrc
[rancher@node1 ~]$ su - rancher
[rancher@node1 ~]$ echo "source <(kubectl completion bash)" >> ~/.bashrc
[rancher@node1 ~]$ source ~/.bashrc
  • 查看节点的状态
[rancher@node1 ~]$ kubectl get node
NAME           STATUS   ROLES                      AGE   VERSION
192.168.0.101   Ready    controlplane,etcd,worker   3m   v1.17.2
192.168.0.102   Ready    controlplane,etcd,worker   3m   v1.17.2
192.168.0.103   Ready    controlplane,etcd,worker   3m   v1.17.2

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

[rancher@node1 ~]$ kubectl get pods --all-namespaces
NAMESPACE       NAME                                      READY   STATUS      RESTARTS   AGE
ingress-nginx   default-http-backend-67cf578fc4-rcxnf     1/1     Running     0          11m
ingress-nginx   nginx-ingress-controller-6snj4            1/1     Running     0          11m
ingress-nginx   nginx-ingress-controller-fk67x            1/1     Running     1          11m
ingress-nginx   nginx-ingress-controller-lpbwr            1/1     Running     0          11m
kube-system     canal-2hpwj                               2/2     Running     2          15h
kube-system     canal-9cw6p                               2/2     Running     2          15h
kube-system     canal-l4ssv                               2/2     Running     2          15h
kube-system     coredns-7c5566588d-8zw6n                  1/1     Running     0          11m
kube-system     coredns-7c5566588d-btg2z                  1/1     Running     0          11m
kube-system     coredns-autoscaler-65bfc8d47d-xkssf       1/1     Running     0          11m
kube-system     metrics-server-6b55c64f86-jpz64           1/1     Running     0          11m
kube-system     rke-coredns-addon-deploy-job-5tgtc        0/1     Completed   0          11m
kube-system     rke-ingress-controller-deploy-job-6dtcd   0/1     Completed   0          11m
kube-system     rke-metrics-addon-deploy-job-pf2jv        0/1     Completed   0          11m
kube-system     rke-network-plugin-deploy-job-2r22w       0/1     Completed   0          15h

7)保存配置文件

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

3、安装配置Helm

注意:Helm的3.x版本和2.x版本的安装配置是不同的。3.x版本只需要安装好Helm客户端就行,其他的啥都不用配置。如果你用的是Helm的2.x版本,那可以参考rancher中文文档中的 安装配置Helm

Helm是Kubernetes首选的包管理工具。Helm charts为Kubernetes YAML清单文档提供模板语法。使用Helm,我们可以创建可配置的部署,而不仅仅是使用静态文件。

1)安装Helm客户端

客户端在上面的安装必备工具中已经安装。由于我这里是安装的Helm-v3.x版本,所以不需要配置Helm客户端的访问权限。

2)安装Helm Server(Tiller)

由于这里是安装的Helm-v3.x版本,所以不需要安装Helm Server。

4、Helm安装Rancher

1)添加Chart仓库地址

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

[rancher@node1 ~]$ helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
[rancher@node1 ~]$ helm repo update

2)使用自签名SSL证书安装安装Rancher Server

Rancher Server设计默认需要开启SSL/TLS配置来保证安全,将ssl证书以Kubernetes Secret卷的形式传递给Rancher Server或Ingress Controller。首选创建证书密文,以便Rancher和Ingress Controller可以使用。

这里使用自签名ssl证书。
  • 如果没有自签名ssl证书,可以参考自签名ssl证书 自签名ssl证书,一键生成ssl证书。
[rancher@node1 ~]$ mkdir ssl
[rancher@node1 ~]$ cd ssl/
#先把一键生成ssl证书的脚本另存为create_self-signed-cert.sh,这里因为脚本的内容太多,就不贴出来了,详见上面的超链接。
#然后再用这个脚本生成ssl证书
[rancher@node1 ssl]$ ./create_self-signed-cert.sh --ssl-domain=my.rancher.com --ssl-trusted-ip=192.168.0.41 --ssl-size=2048 --ssl-date=3650
  • 一键生成的ssl自签名证书脚本将自动生成tls.crt、tls.key、cacerts.pem三个文件
文件名称不能修改。如果使用你自己生成的自签名ssl证书,则需要将服务证书和CA中间证书链合并到tls.crt文件中,将私钥复制到或者重命名为tls.key文件,将CA证书复制到作者重命名为cacerts.pem。
  • 使用kubectl在命名空间 cattle-system 中创建 tls-ca 和 tls-rancher-ingress 两个secret。
# 创建命名空间
[rancher@node1 ~]$ kubectl create namespace cattle-system

#服务证书和私钥密文
[rancher@node1 ~]$ kubectl -n cattle-system create \
    secret tls tls-rancher-ingress \
    --cert=/home/rancher/ssl/tls.crt \
    --key=/home/rancher/ssl/tls.key

#ca证书密文
[rancher@node1 ~]$ kubectl -n cattle-system create secret \
    generic tls-ca \
    --from-file=/home/rancher/ssl/cacerts.pem
  • 安装Rancher Server
[rancher@node1 ~]$ helm install rancher rancher-stable/rancher \
    --namespace cattle-system \
    --set hostname=my.rancher.com \
    --set ingress.tls.source=secret \
    --set privateCA=true

注意:证书对应的域名需要与hostname选项匹配,否则ingress将无法代理访问Rancher。

  • my.rancher.com是后面访问rancher的域名,需要在/etc/hosts文件中添加关联(所有主机):
[root@node1 ~]$ echo "192.168.0.41 my.rancher.com" >> /etc/hosts
[root@node2 ~]$ echo "192.168.0.41 my.rancher.com" >> /etc/hosts
[root@node3 ~]$ echo "192.168.0.41 my.rancher.com" >> /etc/hosts
[root@nginx ~]$ echo "192.168.0.41 my.rancher.com" >> /etc/hosts

3)为Agent Pod添加主机别名

由于我们是通过添加/etc/hosts主机名的方式制定的Rancher Server域名,所以需要为Agent Pod添加主机名(/etc/hosts),让其可以正常通过Rancher Server Url与Rancher Server通信。

  • 执行以下命令为Rancher Server容器配置hosts:
[rancher@node1 ~]$ kubectl -n cattle-system patch deployments rancher --patch '{
    "spec": {
        "template": {
            "spec": {
                "hostAliases": [
                    {
                        "hostnames":
                        [
                            "my.rancher.com"
                        ],
                            "ip": "192.168.0.100"
                    }
                ]
            }
        }
    }
}
  • cattle-cluster-agent Pod和cattle-node-agent pod需要在LOCAL集群初始化之后才会部署,所以先通过Rancher Server URL访问Rancher Web UI进行初始化。
# 将刚刚的域名映射关系写入到Windows主机的hosts文件中。

192.168.0.100 my.rancher.com

rancher怎么命令行改镜像 rancher使用_linux_03

输入:admin/admin。

rancher怎么命令行改镜像 rancher使用_nginx_04

设置好URL之后,进入到Rancher。

刚进来,会看到一个问题。

rancher怎么命令行改镜像 rancher使用_linux_05

报这个问题的原因是cattle-cluster-agent Pod和cattle-node-agent pod还没有被创建成功,不急,接着往下看。

  • Rancher Web UI中依次进入 local集群/system项目,在cattle-system命名空间中查看是否有cattle-cluster-agent Podcattle-node-agent pod被创建。如果有创建则进行下面的步骤,没有创建则等待;
  • cattle-cluster-agent pod
[rancher@node1 ~]$ kubectl -n cattle-system \
patch deployments cattle-cluster-agent --patch '{
    "spec": {
        "template": {
            "spec": {
                "dnsPolicy": "ClusterFirstWithHostNet",
                "hostNetwork": true,
                "hostAliases": [
                    {
                        "hostnames":
                        [
                            "my.rancher.com"
                        ],
                            "ip": "192.168.0.100"
                    }
                ]
            }
        }
    }
}
  • cattle-node-agent pod
[rancher@node1 ~]$ kubectl -n cattle-system \
patch  daemonsets cattle-node-agent --patch '{
    "spec": {
        "template": {
            "spec": {
                "hostAliases": [
                    {
                        "hostnames":
                        [
                            "my.rancher.com"
                        ],
                            "ip": "192.168.0.41"
                    }
                ]
            }
        }
    }
}

稍等一段时间之后,再来看cattle-system命名空间中的状态,发现cattle-cluster-agent Podcattle-node-agent pod都变为了Active状态了。

rancher怎么命令行改镜像 rancher使用_nginx_06

  • 通过命令行来查看下pod的状态:
[rancher@node1 ~]$ kubectl get -n cattle-system pod
NAME                                    READY   STATUS    RESTARTS   AGE
cattle-cluster-agent-7dc756ff44-skjml   1/1     Running   0          5m25s
cattle-node-agent-5pcnn                 1/1     Running   0          5m1s
cattle-node-agent-6hbxt                 1/1     Running   0          5m4s
cattle-node-agent-hwk2l                 1/1     Running   0          5m5s
rancher-58b6b8cfd-9tg8m                 1/1     Running   0          12m
rancher-58b6b8cfd-r5bft                 1/1     Running   2          12m
rancher-58b6b8cfd-vz82g                 1/1     Running   1          12m

都是running状态,没问题。

然后再回头来看看Rancher中local集群的状态,就不会报连接问题了。

rancher怎么命令行改镜像 rancher使用_linux_07

到这里,Rancher集群的HA部署就基本完成了。