手把手教你使用RKE快速部署K8S集群并部署Rancher HA

 杨紫熹   2019-12-31 14:18   4404 人阅读  0 条评论

手把手教你使用RKE快速部署K8S集群并部署Rancher HA  第1张

作者:杨紫熹

原文链接:https://fs.tn/post/PmaL-uIiQ/


RKE全称为Rancher Kubernetes Engine,是一款经过CNCF认证的开源Kubernetes发行版,可以在Docker容器内部运行。它解决了Kubernetes社区中最常见的问题——安装十分复杂。借助RKE,可以简化Kubernetes的安装和操作,并且用户可以在任何操作系统和平台上运行它。


安装RKE


首先需要下载RKE这个工具,下载地址为:

https://github.com/rancher/rke/releases

根据自己的平台,下载对应的可执行文件,下面我以ubuntu来做演示说明。


  1. 下载rke_linux_amd64

  2. chmod +x rke_linux_amd64赋予可执行权限

  3. 改名为rke,mv rke_linux_amd64 rke

  4. 放入bin目录(可选)


以上三步就安装好了RKE,mac可以直接用brew安装,命令为brew install rke



部署Kubernetes集群


生成集群配置文件


安装好了RKE之后,首先生成RKE的配置文件。


使用自带命令rke config,生成cluster.yml配置文件


生成之后默认会有一个示例的配置文件。文件中的controlplane 就是k8s中所说的master。下面来看下这个配置文件(已经经过修改的版本)。


我们以3主3etcd,3work这种经典k8s集群模式来讲解下配置文件改如何写。请仔细阅读,对于部署k8s有以下几点需要注意的。


  • 账户不能用root账户

  • 所有节点的时间必须同步

  • 使用的非root账户要能正常使用docker

  • 配置建议再2C4G以上,推荐是4C8G比较合适,磁盘40G


nodes:
  - address: 192.168.1.1
      port: "22" # ssh 端口    
      internal_address: "" # 内网IP,如果是公有云的这种有公私网两个IP的,则address配置为公网IP    
      role:      
          - controlplane  # 控制节点校色,等于k8s的master      
          - etcd    
      user: ubuntu  # 服务器登陆账户    
      hostname_override: master-etcd-01    
      docker_socket: /var/run/docker.sock  # docker sock所在路径,如果是用snap安装的dockers需要自行修改    
      ssh_key_path: "~/.ssh/id_rsa"  # ssh key的路径,必须是免密登录,不能使用账户密码    
      labels: {} # 标签说明                        
  - address: 192.168.1.2    
      port: "22"    
      internal_address: ""    
      role:      
          - controlplane      
          - etcd    
      user: ubuntu    
      hostname_override: master-etcd-02    
      docker_socket: /var/run/docker.sock    
      ssh_key_path: ~/.ssh/id_rsa  
  - address: 192.168.1.3    
        port: "22"    
        internal_address: ""    
        role:      
             - controlplane      
         - etcd    
        user: ubuntu    
        hostname_override: master-etcd-03    
        docker_socket: /var/run/docker.sock    
        ssh_key_path: ~/.ssh/id_rsa  
  - address: 192.168.1.4    
        port: "22"    
        internal_address: ""    
        role:      
        - worker    
        user: ubuntu    
        hostname_override: worker-1    
        docker_socket: /var/run/docker.sock    
        ssh_key_path: ~/.ssh/id_rsa    
        labels:      
            app: ingress  # 标记后只有该标记节点会部署ingress  
  - address: 192.168.1.6    
            port: "22"    
            internal_address: ""    
            role:      
            - worker    
            user: ubuntu    
            hostname_override: worker-2    
            docker_socket: /var/run/docker.sock    
            ssh_key_path: ~/.ssh/id_rsa    
            labels:      
            app: ingress  
  - address: 192.168.1.7   
        port: "22"    
        internal_address: ""    
        role:      
        - worker    
        user: ubuntu    
        hostname_override: worker-3    
        docker_socket: /var/run/docker.sock    
        ssh_key_path: ~/.ssh/id_rsa    
        labels:      
         app: ingress
      services:
      # ETCD相关配置,另外备份是可以备份到s3的,这个配置见官方文档  
        etcd:    
        extra_args:      
        auto-compaction-retention: 240 #(单位小时)      
        # 修改空间配额为$((6*1024*1024*1024)),默认2G,最大8G      
        quota-backend-bytes: "6442450944"    
      backup_config:      
        enabled: true      
        interval_hours: 12      
        retention: 6  
      kube-api:    
        service_cluster_ip_range: 10.43.0.0/16    
        service_node_port_range: "20000-40000"    
        pod_security_policy: false    
        always_pull_images: false
        # 控制器的一些配置,比如节点判断失联后多久开始迁移等  
      kube-controller:    
        extra_args:      
        ## 当节点通信失败后,再等一段时间kubernetes判定节点为notready状态。      
        ## 这个时间段必须是kubelet的nodeStatusUpdateFrequency(默认10s)的整数倍,      
        ## 其中N表示允许kubelet同步节点状态的重试次数,默认40s。      
        node-monitor-grace-period: "20s"      
        ## 再持续通信失败一段时间后,kubernetes判定节点为unhealthy状态,默认1m0s。      
        node-startup-grace-period: "30s"      
        ## 再持续失联一段时间,kubernetes开始迁移失联节点的Pod,默认5m0s。      
        pod-eviction-timeout: "1m"    
        cluster_cidr: 10.42.0.0/16    
        service_cluster_ip_range: 10.43.0.0/16
     # 集群的一些配置,包括资源预留,集群名字,dns等配置  
      kubelet:    
          extra_args:      
          serialize-image-pulls: "false"      
          registry-burst: "10"      
          registry-qps: "0"      
          # # 节点资源预留      
          # enforce-node-allocatable: 'pods'      
          # system-reserved: 'cpu=0.5,memory=500Mi'      
          # kube-reserved: 'cpu=0.5,memory=1500Mi'      
          # # POD驱逐,这个参数只支持内存和磁盘。      
          # ## 硬驱逐伐值      
          # ### 当节点上的可用资源降至保留值以下时,就会触发强制驱逐。强制驱逐会强制kill掉POD,不会等POD自动退出。      
          # eviction-hard: 'memory.available<300Mi,nodefs.available<10%,imagefs.available<15%,nodefs.inodesFree<5%'      
          # ## 软驱逐伐值      
          # ### 以下四个参数配套使用,当节点上的可用资源少于这个值时但大于硬驱逐伐值时候,会等待eviction-soft-grace-period设置的时长;      
          # ### 等待中每10s检查一次,当最后一次检查还触发了软驱逐伐值就会开始驱逐,驱逐不会直接Kill POD,先发送停止信号给POD,
          然后等待eviction-max-pod-grace-period设置的时长;      
          # ### 在eviction-max-pod-grace-period时长之后,如果POD还未退出则发送强制kill POD"      
          # eviction-soft: 'memory.available<500Mi,nodefs.available<50%,imagefs.available<50%,nodefs.inodesFree<10%'      
          # eviction-soft-grace-period: 'memory.available=1m30s'      
          # eviction-max-pod-grace-period: '30'      
          # eviction-pressure-transition-period: '30s'    
          cluster_domain: cluster.local    
          infra_container_image: ""    
          cluster_dns_server: 10.43.0.10    
          fail_swap_on: false  
        kubeproxy:    
          extra_args:      
          # 默认使用iptables进行数据转发,如果要启用ipvs,则此处设置为`ipvs`      
          proxy-mode: "ipvs"
       # 配置集群的CNI网络模型
       network:  
          plugin: canal  
          options:    
          flannel_backend_type: "vxlan"
        ssh_key_path: ~/.ssh/id_rsa
        ssh_agent_auth: false
        authorization:  
          mode: rbac
          ignore_docker_version: false
          # k8s的版本,可以通过rke config --system-images --all 命令列出所有rke支持的版本
       kubernetes_version: v1.15.4-rancher1-2
       # 国内使用阿里云的镜像
       private_registries:  
          - url: registry.cn-shanghai.aliyuncs.com    
          user:    
          password:    
          is_default: true
       # 配置ingress,目前RKE支持nginx。
       ingress:  
          provider: "nginx"  
          # 节点选择,和上面node配置结合的  
          node_selector:    
          app: ingress  
          options:    
          use-forwarded-headers: "true"
       cluster_name: rancher
       addon_job_timeout: 0
       restore:  
          restore: false  
          snapshot_name: ""


大部分的配置都注释说明了,基本上需要用到的配置就这些了,更详细的配置需要查阅官方文档。文档链接:

https://docs.rancher.cn/rke/example-yamls.html


开始部署


配置完毕之后,就是开始部署了,rke的启动非常简单,在配置文件目录使用./rke up就可以了。


启动完毕之后,等待大约10分钟左右,会提示Finished building Kubernetes cluster successfully


部署的过程中,日志可能会显示WARN的提示,这个是没有关系的。只要不出现ERR即可。


  • 可能会出现的错误:


  1. etcd健康检查不通过,出现证书错误的情况,这个报错一般是因为时间不同步导致的。

  2. 无法访问到node,这个报错一般是因为地址配置出错

  3. Failed to set up SSH tunneling for host,这个报错一般是使用了root用户或者docker sock配置错误

  4. Failed to dial ssh using address,ssh-key配置错误


部署成功之后,有三个文件需要特别保存。


  • cluster.yml:RKE集群配置文件。

  • kube_config_cluster.yml:集群的Kubeconfig文件,此文件包含完全访问集群的凭据。

  • cluster.rkestate:Kubernetes集群状态文件,此文件包含访问集群的重要凭据。


有了以上三个文件,就可以对集群做新增、删除节点、升级集群版本的操作,所以必须要保存好。


部署Helm


创建helm权限


运行下面命令创建好helm的权限


kubectl --kubeconfig=kube_config_cluster.yml -n kube-system create serviceaccount tiller
kubectl --kubeconfig=kube_config_cluster.yml create clusterrolebinding tiller \
--clusterrole cluster-admin --serviceaccount=kube-system:tiller


初始化helm


这里首先在自己的机子上装好helm,怎么装这里不再多说了,可以自行百度或者Google。


安装好了之后,可以直接运行helm init --kubeconfig=kube_config_cluster.yml来初始化。但是这里有有一个问题,可能会有镜像拉不下来的情况。所以推荐使用下面的命令来初始化。


helm init --kubeconfig=kube_config_cluster.yml \
--service-account tiller --skip-refresh \
--tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:v2.14.1


里面的镜像是Rancher给的镜像地址。当然也可以换成自己的。


运行完命令之后,可以通过kubectl看一看tiller是否正常启动了。


更新helm


更新就直接使用kubectl的命令,升级镜像版本即可。命令如下(版本号可能和最新的不一样,请不要直接使用)


kubectl --kubeconfig=kube_config_cluster.yml --namespace=kube-system \
  set image deployments/tiller-deploy \
  tiller=registry.cn-shanghai.aliyuncs.com/rancher/tiller:v3.0.1


添加Rancher的charts


添加Rancher的stable版本charts


helm repo add rancher-stable \
https://releases.rancher.com/server-charts/stable --kubeconfig=kube_config_cluster.yml


安装Rancher


我这里使用的是外部负载均衡的模式,就是在k8s之外,还有一个nginx作为入口负载均衡,同时ssl也截至到这个nginx。所以下面的配置中,加上了--set tls=external。如果你是直接使用集群作为入口的,则不需要这个参数,需要自己配置ssl证书。具体参考官网。


helm --kubeconfig=kube_config_cluster.yml install rancher-stable/rancher \    
    --name rancher --namespace cattle-system \    
    --set hostname=rancher.asoco.com.cn \    
    --set tls=external


到此实际上整个集群和Rancher都已经部署好了。接下来需要配置外部的nginx负载均衡器。


外部负载均衡器nginx的配置


nginx的配置我直接贴出来:


# zip压缩相关的配置
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-fontobject font/woff2  
  image/x-icon image/png image/jpeg;
  
# 这里配置为配置了ingress的work节点  
upstream rancher {    
     server 192.168.1.5:80;    
     server 192.168.1.6:80;    
     server 192.168.1.7:80;
     }
     
     map $http_upgrade $connection_upgrade {    
     default Upgrade;    
     ''      close;
     }
     server {    
     listen 443 ssl ;    
     #配置域名    
     server_name rancher..com.cn;    
     #配置证书    
     ssl_certificate /etc/nginx/rancher.com.cn.sslkey/fullchain.pem;    
     ssl_certificate_key /etc/nginx/rancher.com.cn.sslkey/privkey.pem;    
     
     location / {        
     proxy_set_header Host $host;        
     proxy_set_header X-Forwarded-Proto https;        
     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;        
     proxy_buffering off;    
     }
}
# 配置301重定向
  server {    
  listen 80;    
  server_name rancher.com.cn;    
  return 301 https://$server_name$request_uri;
  }


将以上配置,新增一个rancher.conf配置文件,然后放到/etc/nginx/conf.d/文件夹中,然后nginx重载配置即可。


总  结


在上面步骤都做完之后,访问域名即可打开Rancher,并且Rancher已经默认接管集群了,开始享有Rancher的便捷吧。

本文地址:https://dockerworld.cn/?id=50
温馨提示:文章内容系作者个人观点,不代表Docker中文社区对观点赞同或支持。
版权声明:本文为转载文章,来源于 杨紫熹 ,版权归原作者所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?