通过7层负载均衡来部署Rancher HA 负载均衡 集群方案 架构软件


4层代理中主要是TCP协议代理,TCP代理主要基于IP+端口来通信。

7层代理中主要是http协议, http协议主要基于URL来通信。



1.安装Docker-CEhttps://abc.htmltoo.com/thread-45069.htm

   安装rancher2

2.Nginx配置

vi  /etc/nginx/conf.d/rancher.conf

upstream rancher {
    server IP_NODE_1:80;
    server IP_NODE_2:80;
    server IP_NODE_3:80;
}
map $http_upgrade $connection_upgrade {
    default Upgrade;
    ''      close;
}
server {
    listen 443 ssl http2;
    server_name FQDN;
    ssl_certificate /certs/fullchain.pem;
    ssl_certificate_key /certs/privkey.pem;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://rancher;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        # This allows the ability for the execute shell window to remain open for up to 15  minutes. Without this parameter, the default is 1 minute and will automatically close.
        proxy_read_timeout 900s;
    }
}
server {
    listen 80;
    server_name FQDN;
    return 301 https://$server_name$request_uri;
}

在/etc/nginx/conf.d/rancher.conf中, 替换 IP_NODE_1, IP_NODE_2, IP_NODE_3 为需添加到集群的Linux主机的IP;

在/etc/nginx/conf.d/rancher.conf中, 替换FQDN为你设置用来登录rancher的域名;

在/etc/nginx/conf.d/rancher.conf中, 替换/certs/fullchain.pem为证书的路径;

在/etc/nginx/conf.d/rancher.conf中, 替换/certs/privkey.pem为证书密钥的路径;

-----

cat >> /etc/nginx.conf << EOF
worker_processes 4;
worker_rlimit_nofile 40000;
events {
    worker_connections 8192;
}
stream {
    upstream rancher_servers_http {
        least_conn;
        server 172.18.1.4:80 max_fails=3 fail_timeout=5s;
        server 172.18.1.5:80 max_fails=3 fail_timeout=5s;
        server 172.18.1.9:80 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     80;
        proxy_pass rancher_servers_http;
    }
    upstream rancher_servers_https {
        least_conn;
        server 172.18.1.4:443 max_fails=3 fail_timeout=5s;
        server 172.18.1.5:443 max_fails=3 fail_timeout=5s;
        server 172.18.1.9:443 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     443;
        proxy_pass rancher_servers_https;
    }
}
EOF
docker run -d --restart=unless-stopped   -p 80:80 -p 443:443   -v /etc/nginx.conf:/etc/nginx/nginx.conf  nginx:latest


-----

# 重新加载或者重启NGINX

# Reload NGINX

nginx -s reload

# Restart NGINX

# Depending on your Linux distribution

service nginx restart

systemctl restart nginx


# 访问Rancher:  安装成功后,通过https://FQDN  来访问RANCHER UI


3.配置DNS

选择一个用于访问Rancher的域名(FQDN)(例如,demo.rancher.com).


方案1- 有DNS服务器

1、登录DNS服务,创建一条 A 记录指向负载均衡主机IP;

2、在终端中执行一下命令来验证运行解析是否生效:

nslookup HOSTNAME.DOMAIN.COM
如果解析生效
nslookup demo.rancher.com
DNS Server:         YOUR_HOSTNAME_IP_ADDRESS
DNS Address:        YOUR_HOSTNAME_IP_ADDRESS#53
Non-authoritative answer:
Name:   demo.rancher.com
Address: <负载均衡IP地址>
如果解析不生效
nslookup demo.rancher.com
DNS Server:         YOUR_HOSTNAME_IP_ADDRESS
DNS Address:        YOUR_HOSTNAME_IP_ADDRESS#5
** server can't find demo.rancher.com: NXDOMAIN

方案2 - 无DNS服务

如果环境为内部网络且无DNS服务器,可以通过修改客户端的/etc/hosts文件,添加相应的条目。

vi  /etc/hosts


4.下载 RKE

RKE是一种快速,通用的Kubernetes安装程序,可用于在Linux主机上安装Kubernetes。我们将使用RKE来配置Kubernetes集群并运行Rancher。

a.打开浏览器访问下载文件页面,根据你操作系统类型下载最新版本的RKE:

MacOS: rke_darwin-amd64

Linux: rke_linux-amd64

Windows: rke_windows-amd64.exe

b.通过chmod +x命令给刚下载的RKE二进制文件添加可执行权限。

如果是Windows系统,则跳过这一步.

# MacOS
$ chmod +x rke_darwin-amd64
# Linux
$ chmod +x rke_linux-amd64

c.确认RKE是否是最新版本:

# MacOS
./rke_darwin-amd64 --version
# Linux
./rke_linux-amd64 --version
步骤结果: 你将看到以下内容:
rke version v<N.N.N>

5.下载RKE配置模板

RKE通过 .yml 配置文件来安装和配置Kubernetes集群,有2个模板可供选择,具体取决于使用的SSL证书类型。


a.根据你使用的SSL证书类型,选择模板下载:

Template for self-signed certificate

vi 3-node-externalssl-certificate.yml

nodes:
  - address: <IP> # hostname or IP to access nodes
    user: <USER> # root user (usually 'root')
    role: [controlplane,etcd,worker] # K8s roles for node
    ssh_key_path: <PEM_FILE> # path to PEM file
  - address: <IP>
    user: <USER>
    role: [controlplane,etcd,worker]
    ssh_key_path: <PEM_FILE>
  - address: <IP>
    user: <USER>
    role: [controlplane,etcd,worker]
    ssh_key_path: <PEM_FILE>
addons: |-
  ---
  kind: Namespace
  apiVersion: v1
  metadata:
    name: cattle-system
  ---
  kind: ServiceAccount
  apiVersion: v1
  metadata:
    name: cattle-admin
    namespace: cattle-system
  ---
  kind: ClusterRoleBinding
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: cattle-crb
    namespace: cattle-system
  subjects:
  - kind: ServiceAccount
    name: cattle-admin
    namespace: cattle-system
  roleRef:
    kind: ClusterRole
    name: cluster-admin
    apiGroup: rbac.authorization.k8s.io
  ---
  apiVersion: v1
  kind: Secret
  metadata:
    name: cattle-keys-server
    namespace: cattle-system
  type: Opaque
  data:
    cacerts.pem: <BASE64_CA>  # CA cert used to sign cattle server cert and key
  ---
  apiVersion: v1
  kind: Service
  metadata:
    namespace: cattle-system
    name: cattle-service
    labels:
      app: cattle
  spec:
    ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
    selector:
      app: cattle
  ---
  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    namespace: cattle-system
    name: cattle-ingress-http
    annotations:
      nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
      nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"   # Max time in seconds for ws to remain shell window open
      nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"   # Max time in seconds for ws to remain shell window open
      nginx.ingress.kubernetes.io/ssl-redirect: "false"        # Disable redirect to ssl
  spec:
    rules:
    - host: <FQDN>
      http:
        paths:
        - backend:
            serviceName: cattle-service
            servicePort: 80
  ---
  kind: Deployment
  apiVersion: extensions/v1beta1
  metadata:
    namespace: cattle-system
    name: cattle
  spec:
    replicas: 1
    template:
      metadata:
        labels:
          app: cattle
      spec:
        serviceAccountName: cattle-admin
        containers:
        - image: rancher/rancher:latest
          imagePullPolicy: Always
          name: cattle-server
          ports:
          - containerPort: 80
            protocol: TCP
          volumeMounts:
          - mountPath: /etc/rancher/ssl
            name: cattle-keys-volume
            readOnly: true
        volumes:
        - name: cattle-keys-volume
          secret:
            defaultMode: 420
            secretName: cattle-keys-server

Template for certificate signed by recognized CA


vi 3-node-externalssl-recognizedca.yml

nodes:
  - address: <IP> # hostname or IP to access nodes
    user: <USER> # root user (usually 'root')
    role: [controlplane,etcd,worker] # K8s roles for node
    ssh_key_path: <PEM_FILE> # path to PEM file
  - address: <IP>
    user: <USER>
    role: [controlplane,etcd,worker]
    ssh_key_path: <PEM_FILE>
  - address: <IP>
    user: <USER>
    role: [controlplane,etcd,worker]
    ssh_key_path: <PEM_FILE>
addons: |-
  ---
  kind: Namespace
  apiVersion: v1
  metadata:
    name: cattle-system
  ---
  kind: ServiceAccount
  apiVersion: v1
  metadata:
    name: cattle-admin
    namespace: cattle-system
  ---
  kind: ClusterRoleBinding
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: cattle-crb
    namespace: cattle-system
  subjects:
  - kind: ServiceAccount
    name: cattle-admin
    namespace: cattle-system
  roleRef:
    kind: ClusterRole
    name: cluster-admin
    apiGroup: rbac.authorization.k8s.io
  ---
  apiVersion: v1
  kind: Service
  metadata:
    namespace: cattle-system
    name: cattle-service
    labels:
      app: cattle
  spec:
    ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
    selector:
      app: cattle
  ---
  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    namespace: cattle-system
    name: cattle-ingress-http
    annotations:
      nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
      nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"   # Max time in seconds for ws to remain shell window open
      nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"   # Max time in seconds for ws to remain shell window open
      nginx.ingress.kubernetes.io/ssl-redirect: "false"        # Disable redirect to ssl
  spec:
    rules:
    - host: <FQDN>
      http:
        paths:
        - backend:
            serviceName: cattle-service
            servicePort: 80
  ---
  kind: Deployment
  apiVersion: extensions/v1beta1
  metadata:
    namespace: cattle-system
    name: cattle
  spec:
    replicas: 1
    template:
      metadata:
        labels:
          app: cattle
      spec:
        serviceAccountName: cattle-admin
        containers:
        - image: rancher/rancher:latest
          imagePullPolicy: Always
          name: cattle-server
          ports:
          - containerPort: 80
            protocol: TCP

b.重命名模板文件为 rancher-cluster.yml


6.节点配置

获得rancher-cluster.yml配置文件模板后,编辑节点部分以指向Linux主机。

a.节点免密登录

第一步:在任意一台Linux主机使用ssh-keygen命令产生公钥私钥对

ssh-keygen

第二步:通过ssh-copy-id命令将公钥复制到远程机器中

ssh-copy-id -i .ssh/id_rsa.pub  $user@192.168.x.xxx

b.编辑rancher-cluster.yml配置文件

编辑器打开 rancher-cluster.yml 文件,在nodes配置版块中,修改 IP_ADDRESS_X and USER为你真实的Linux主机IP和用户名,ssh_key_path为第一步生成的私钥文件,如果是在RKE所在主机上生成的公钥私钥对,此配置可保持默认:

nodes:
  - address: IP_ADDRESS_1
    # THE IP ADDRESS OR HOSTNAME OF THE NODE
    user: USER
    # USER WITH ADMIN ACCESS. USUALLY `root`
    role: [controlplane,etcd,worker]
    ssh_key_path: ~/.ssh/id_rsa
    # PATH TO SSH KEY THAT AUTHENTICATES ON YOUR WORKSTATION
    # USUALLY THE VALUE ABOVE
  - address: IP_ADDRESS_2
    user: USER
    role: [controlplane,etcd,worker]
    ssh_key_path: ~/.ssh/id_rsa
  - address: IP_ADDRESS_3
    user: USER
    role: [controlplane,etcd,worker]
    ssh_key_path: ~/.ssh/id_rsa

使用RHEL/CentOS系统时,因为系统安全限制,ssh不能使用root账户。


7.证书配置

出于安全考虑,使用Rancher需要SSL加密。 SSL可以保护所有Rancher网络通信,例如登录或与集群交互时。

a.方案A — 使用自签名证书

先决条件:

      i.证书必须是PEM格式,PEM只是一种证书类型,并不是说文件必须是PEM为后缀,具体可以查看证书类型;

      ii.证书必须通过base64加密;

      iii.在你的证书文件中,包含链中的所有中间证书;

在kind: Secret和name: cattle-keys-ingress中:

      替换为CA证书文件的base64编码字符串(通常称为ca.pem或ca.crt)

注意:

base64编码的字符串应该与cacerts.pem在同一行,冒号后有一个空格,在开头,中间或结尾没有任何换行符。

结果:替换值后,文件应如下所示(base64编码的字符串应该不同):

---
apiVersion: v1
kind: Secret
metadata:
  name: cattle-keys-server
  namespace: cattle-system
type: Opaque
data:
    cacerts.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvRENDQVlnQ0NRRHVVWjZuMEZWeU16QU5CZ2txaGtpRzl3MEJBUXNGQURBU01SQXdEZ1lEVlFRRERBZDAKWlhOMExXTmhNQjRYRFRFNE1EVXdOakl4TURRd09Wb1hEVEU0TURjd05USXhNRFF3T1Zvd0VqRVFNQTRHQTFVRQpBd3dIZEdWemRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNQmpBS3dQCndhRUhwQTdaRW1iWWczaTNYNlppVmtGZFJGckJlTmFYTHFPL2R0RUdmWktqYUF0Wm45R1VsckQxZUlUS3UzVHgKOWlGVlV4Mmo1Z0tyWmpwWitCUnFiZ1BNbk5hS1hocmRTdDRtUUN0VFFZdGRYMVFZS0pUbWF5NU45N3FoNTZtWQprMllKRkpOWVhHWlJabkdMUXJQNk04VHZramF0ZnZOdmJ0WmtkY2orYlY3aWhXanp2d2theHRUVjZlUGxuM2p5CnJUeXBBTDliYnlVcHlad3E2MWQvb0Q4VUtwZ2lZM1dOWmN1YnNvSjhxWlRsTnN6UjVadEFJV0tjSE5ZbE93d2oKaG41RE1tSFpwZ0ZGNW14TU52akxPRUc0S0ZRU3laYlV2QzlZRUhLZTUxbGVxa1lmQmtBZWpPY002TnlWQUh1dApuay9DMHpXcGdENkIwbkVDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFHTCtaNkRzK2R4WTZsU2VBClZHSkMvdzE1bHJ2ZXdia1YxN3hvcmlyNEMxVURJSXB6YXdCdFJRSGdSWXVtblVqOGo4T0hFWUFDUEthR3BTVUsKRDVuVWdzV0pMUUV0TDA2eTh6M3A0MDBrSlZFZW9xZlVnYjQrK1JLRVJrWmowWXR3NEN0WHhwOVMzVkd4NmNOQQozZVlqRnRQd2hoYWVEQmdma1hXQWtISXFDcEsrN3RYem9pRGpXbi8walI2VDcrSGlaNEZjZ1AzYnd3K3NjUDIyCjlDQVZ1ZFg4TWpEQ1hTcll0Y0ZINllBanlCSTJjbDhoSkJqa2E3aERpVC9DaFlEZlFFVFZDM3crQjBDYjF1NWcKdE03Z2NGcUw4OVdhMnp5UzdNdXk5bEthUDBvTXl1Ty82Tm1wNjNsVnRHeEZKSFh4WTN6M0lycGxlbTNZQThpTwpmbmlYZXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==

b.方案B—使用权威CA机构颁发的证书


8.域名配置

RKE配置文件中有一个<FQDN>引用,编辑配置文件替换<FQDN>:

结果: 替换值后,文件应如下所示(base64编码的字符串应该不同):

apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    namespace: cattle-system
    name: cattle-ingress-http
    annotations:
      nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
      nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"   # Max time in seconds for ws toremain shell window open
      nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"   # Max time in seconds for ws toremain shell window open
  spec:
    rules:
    - host: demo.rancher.com
      http:
        paths:
        - backend:
            serviceName: cattle-service
            servicePort: 80


9.备份配置文件

保存关闭.yml文件后,将其备份到安全位置。升级Rancher时,你需要再次使用此文件。


10.运行RKE

完成所有配置后,你可以通过运行rke up命令并使用–config参数指定配置文件来完成Rancher 集群的安装。

      i.下载RKE二进制文档到你的主机,确保 rancher-cluster.yml与下载的rke 在同一目录下;

      ii.打开shell 终端,切换路径到RKE所在的目录;

      iii.根据操作系统类型,选择以下命令并执行:

# MacOS
./rke_darwin-amd64 up --config rancher-cluster.yml
# Linux
./rke_linux-amd64 up --config rancher-cluster.yml

结果: 应该会有以下日志输出:

INFO[0000] Building Kubernetes cluster
INFO[0000] [dialer] Setup tunnel for host [1.1.1.1]
INFO[0000] [network] Deploying port listener containers
INFO[0000] [network] Pulling image [alpine:latest] on host [1.1.1.1]
...
INFO[0101] Finished building Kubernetes cluster successfully


11.备份自动生成的kubectl配置文件

在安装过程中,RKE会自动生成一个kube_config_rancher-cluster.yml与RKE二进制文件位于同一目录中的配置文件。此文件很重要,它可以在Rancher server故障时,利用kubectl通过此配置文件管理Kubernetes集群。复制此文件将其备份到安全位置。


12.要更改主机端口映射,替换-p 80:80 -p 443:443为-p 8080:80 -p 8443:443:

docker run -d --restart=unless-stopped -p 8080:80 -p 8443:443 rancher/rancher:latest


参考网址:

https://www.cnrancher.com/docs/rancher/v2.x/cn/

https://www.cnrancher.com/docs/rancher/v2.x/cn/installation/server-installation/ha-install-external-lb/https-l7/

签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回