4 - 安装Rancher


一、初始化Helm

注意 Helm运行需要依赖kubectl,点击了解安装和配置kubectl

  • 配置Helm客户端访问权限

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

在离线环境中安装有kubectl的主机上执行以下命令

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. kubectl --kubeconfig=$kubeconfig -n kube-system \
  4. create serviceaccount tiller
  5. kubectl --kubeconfig=$kubeconfig \
  6. create clusterrolebinding tiller \
  7. --clusterrole cluster-admin \
  8. --serviceaccount=kube-system:tiller
  • 创建registry secret(可选)

    • Helm初始化的时候会去拉取tiller镜像,如果镜像仓库为私有仓库,则需要配置登录凭证。在离线环境中安装有kubectl的主机上执行以下命令:
  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. kubectl --kubeconfig=$kubeconfig -n kube-system \
  4. create secret docker-registry regcred \
  5. --docker-server="reg.example.com" \
  6. --docker-username=<user> \
  7. --docker-password=<password> \
  8. --docker-email=<email>
  • Patch the ServiceAccount
  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. kubectl --kubeconfig=$kubeconfig -n kube-system \
  4. patch serviceaccount tiller -p '{"imagePullSecrets": [{"name\": "regcred"}]}'
  • 安装Helm客户端

在离线环境中安装有kubectl的主机上安装Helm客户端,参考安装Helm客户端了解Helm客户端安装。

  • 安装Helm Server(Tiller)

注意:1、helm init在缺省配置下,会去谷歌镜像仓库拉取gcr.io/kubernetes-helm/tiller镜像,并在Kubernetes集群上安装配置Tiller。离线环境下,可通过—tiller-image指定私有镜像仓库镜像。2、helm init在缺省配置下,会利用https://kubernetes-charts.storage.googleapis.com作为缺省的stable repository地址,并去更新相关索引文件。3、如果您是离线安装Tiller, 如果有内部的chart仓库,可通过—stable-repo-url指定内部chart地址;如果没有内部的chart仓库, 可通过添加—skip-refresh参数禁止Tiller更新索引。

在离线环境中安装有kubectl和Helm客户端的主机上执行以下命令

  1. kubeconfig=xxx.yaml
  2. helm_version=`helm version |grep Client | awk -F""\" '{print $2}'`
  3. helm init --kubeconfig=$kubeconfig --skip-refresh \
  4. --service-account tiller \
  5. --tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:${helm_version}

二、打包Rancher Charts模板

此步骤需要在能连接互联网的主机上操作,在可访问互联网并安装有Helm客户端的主机上执行以下操作。

  • 添加Rancher Charts仓库。

指定安装的版本(比如: latest or stable),可通过版本选择查看版本说明。

  1. helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
  • 获取Rancher Charts离线包。

指定安装的版本(比如: lateststable或者通过—version指定版本),可通过版本选择查看版本说明。

  1. helm fetch rancher-stable/rancher --version v2.2.3

结果 默认在当前目录下生成rancher-vx.x.x.tgz压缩文件,可通过-d指定生成的压缩包路径,比如:helm fetch rancher-stable/rancher —version v2.2.3 -d /home,将会在/home目录下生成rancher-vx.x.x.tgz压缩文件。

三、离线安装Rancher

将生成的rancher-vx.x.x.tgz文件拷贝到离线环境安装有kubectl和Helm客户端的主机上,解压rancher-vx.x.x.tgz文件获得rancher文件夹。

  • 以TCP L4负载均衡器或者ingress作为访问入口
  • 使用权威认证证书

服务证书和CA中间证书链合并名为tls.crt的文件中,将私钥复制到名为tls.key的文件中。使用kubectl创建类型为tlssecrets

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. kubectl --kubeconfig=$kubeconfig \
  4. create namespace cattle-system
  5. kubectl --kubeconfig=$kubeconfig \
  6. -n cattle-system create secret \
  7. tls tls-rancher-ingress \
  8. --cert=./tls.crt \
  9. --key=./tls.key

注意 必须把服务证书文件和key文件重命名为tls.crttls.key

然后执行以下命令进行rancher安装:

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. helm --kubeconfig=$kubeconfig install ./rancher \
  4. --name rancher \
  5. --namespace cattle-system \
  6. --set hostname=<修改为自己的域名> \
  7. --set ingress.tls.source=secret
  8. --set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher:stable
  • 使用自己的自签名证书

如果使用的是自己创建的自签名证书,则需要创建证书secret和CA证书secret

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. kubectl --kubeconfig=$kubeconfig \
  4. create namespace cattle-system
  5. kubectl --kubeconfig=$kubeconfig \
  6. -n cattle-system create \
  7. secret tls tls-rancher-ingress \
  8. --cert=./tls.crt \
  9. --key=./tls.key
  10. kubectl --kubeconfig=$kubeconfig \
  11. -n cattle-system \
  12. create secret generic tls-ca \
  13. --from-file=cacerts.pem

注意 必须保证文件名为cacerts.pemtls.crttls.key

然后执行以下命令进行rancher安装

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. helm --kubeconfig=$kubeconfig install ./rancher \
  4. --name rancher \
  5. --namespace cattle-system \
  6. --set hostname=<修改为自己的域名> \
  7. --set ingress.tls.source=secret \
  8. --set privateCA=true \
  9. --set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher:stable
  • 以外部HTTP L7负载均衡器作为访问入口(nginx为例)
  • 使用权威认证证书

使用外部七层负载均衡器作为访问入口,那么将需要把ssl证书配置在L7负载均衡器上面,如果是权威认证证书,rancher侧则无需配置证书。参考nginx配置示例了解L7负载均衡器证书配置方法。

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. helm --kubeconfig=$kubeconfig install ./rancher \
  4. --name rancher \
  5. --namespace cattle-system \
  6. --set hostname=<修改为自己的域名> \
  7. --set tls=external \
  8. --set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher:stable
  • 使用自己的自签名证书

使用外部七层负载均衡器作为访问入口,那么将需要把ssl证书配置在L7负载均衡器上面,如果是自己的自签名证书,则需要把CA证书以密文的形式导入rancher。参考nginx配置示例了解L7负载均衡器证书配置方法。

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. kubectl --kubeconfig=$kubeconfig \
  4. create namespace cattle-system
  5. kubectl --kubeconfig=$kubeconfig \
  6. -n cattle-system create \
  7. secret generic tls-ca \
  8. --from-file=cacerts.pem

注意 必须保证文件名为cacerts.pem

然后执行以下命令进行rancher安装

  1. # 指定kubeconfig配置文件
  2. kubeconfig=kube_configxxx.yml
  3. helm --kubeconfig=$kubeconfig install ./rancher \
  4. --name rancher \
  5. --namespace cattle-system \
  6. --set hostname=<修改为自己的域名> \
  7. --set privateCA=true \
  8. --set tls=external \
  9. --set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher:stable

四、为Cluster Pod添加主机别名(/etc/hosts)(可选)

如果您没有内部DNS服务器而是通过添加/etc/hosts主机别名的方式指定的Rancher server域名,那么不管通过哪种方式(自定义、导入、Host驱动等)创建K8S集群,K8S集群运行起来之后,因为cattle-cluster-agent Podcattle-node-agent无法通过DNS记录找到Rancher server,最终导致无法通信。

解决方法

可以通过给cattle-cluster-agent Podcattle-node-agent添加主机别名(/etc/hosts),让其可以正常通信(前提是IP地址可以互通)

  • cattle-cluster-agent pod
  1. #指定kubectl配置文件
  2. export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
  3. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  4. patch deployments cattle-cluster-agent --patch '{
  5. "spec": {
  6. "template": {
  7. "spec": {
  8. "hostAliases": [
  9. {
  10. "hostnames":
  11. [
  12. "demo.cnrancher.com"
  13. ],
  14. "ip": "192.168.1.100"
  15. }
  16. ]
  17. }
  18. }
  19. }
  20. }'
  • cattle-node-agent pod
  1. #指定kubectl配置文件
  2. export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
  3. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  4. patch daemonsets cattle-node-agent --patch '{
  5. "spec": {
  6. "template": {
  7. "spec": {
  8. "hostAliases": [
  9. {
  10. "hostnames":
  11. [
  12. "xxx.rancher.com"
  13. ],
  14. "ip": "192.168.1.100"
  15. }
  16. ]
  17. }
  18. }
  19. }
  20. }'

1、替换其中的域名和IP 2、注意json中的引号。