Kubernetes rke 集群安装

  • 系统环境准备
操作系统 IP hostnAme
Centos7 64.115.4.23 k8s-master
Centos7 64.115.5.100 k8s-node1
Centos7 64.115.4.200 k8s-node2

一、 初始化操作系统

脚本内容如下,根据自己环境修改。

#!/bin/bash
set -x 
#k8s集群安装服务器初始化脚本

#安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git
#设置防火墙为 Iptables 并设置空规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables&& iptables -F && service iptables save
#关闭 SELINUX
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab && setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
#同步时间
ntpdate ntp3.aliyun.com
#调整系统时区
#设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
#配置域名解析
cat >>  EOF > /etc/hosts 
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
64.115.4.23 k8s-master
64.115.5.100 k8s-node1
64.115.5.200 k8s-node2
EOF
#修改主机名
hostnamectl set-hostname  k8s-node1
# docker阿里云源
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

### Install required packages for docker.
yum install -y device-mapper-persistent-data lvm2
yum install -y docker-ce-19.03.8

## Create /etc/docker directory.
mkdir /etc/docker

# Setup daemon.
```bash
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://lqetgo1f.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn/"]
}
EOF
```
mkdir -p /etc/systemd/system/docker.service.d

# Restart Docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker

#重启服务器
reboot
  • 重启后配置

#创建 rke 用户
#useradd rke 
#将rke用户加入docker组
#usermod -aG docker  rke
#免密登录(以下master主机操作)
#su rke
#sh-keygen -t rsa
#ssh-copy-id -i /home/rke/.ssh/id_rsa.pub rke@k8s-master
#ssh-copy-id -i /home/rke/.ssh/id_rsa.pub rke@k8s-node1
#ssh-copy-id -i /home/rke/.ssh/id_rsa.pub rke@k8s-node2

二、使用 RKE 在 Linux 主机上安装 Kubernetes:

使用 GitHub 下载安装包

  1. 登录您的主机,打开浏览器,访问RKE 版本发布页面,下载最新的 RKE v1.2.3

    • Linux (Intel/AMD)rke_linux-amd64
  2. 运行以下命令,将下载的 RKE 二进制安装包复制到/usr/bin/路径下。然后将这个安装包重命名为rke

    mv rke_linux-amd64 /usr/bin/rke
    
  3. 运行以下命令,将 RKE 安装包转为可执行文件。

    chmod +x /usr/bin/rke
    

    三、创建集群配置文件

    RKE 使用集群配置文件cluster.yml规划集群中的节点,例如集群中应该包含哪些节点,如何部署 Kubernetes。您可以通过该文件修改很多集群配置选项。在 RKE 的文档中,我们提供的代码示例假设集群中只有一个节点

    创建集群配置文件cluster.yml的方式有两种:

    • 使用 minimal cluster.yml创建集群配置文件,然后将您使用的节点的相关信息添加到文件中。
    • 使用rke config命令创建集群配置文件,然后将集群参数逐个输入到该文件中。

这是我事先准备好的配置文件cluster.yml

nodes:
- address: "64.115.4.23"
  port: "22"
  internal_address: "64.115.4.23"
  role:
  - controlplane
  - etcd
  hostname_override: "k8s-master"
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ~/.ssh/id_rsa
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {nodes_lables: master}
  taints: []
- address: "64.115.5.100"
  port: "22"
  internal_address: "64.115.5.100"
  role:
  - worker
  hostname_override: "k8s-node1"
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ~/.ssh/id_rsa
  ssh_cert: ""
  ssh_cert_path: ""
  taints: []
  labels:
    ingress: true
    dns: true
    nfs-provisioner: server
- address: "64.115.5.200"
  port: "22"
  internal_address: "64.115.5.200"
  role:
  - worker
  hostname_override: "k8s-node2"
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ~/.ssh/id_rsa
  ssh_cert: ""
  ssh_cert_path: ""
  taints: []
  labels:
    ingress: true
    dns: true
# 如果设置为true,则可以使用不受支持的Docker版本
ignore_docker_version: false

# 集群等级的SSH私钥(private key)
## 如果节点未配置SSH私钥,RKE将会以此私钥去连接集群节点
ssh_key_path: ~/.ssh/id_rsa

# 使用SSH agent来提供SSH私钥
## 需要配置环境变量SSH_AUTH_SOCK指向已添加私钥的SSH agent
ssh_agent_auth: false

# 配置docker root目录
#docker_root_dir: "/u01/install/docker"

# 私有仓库
## 当设置is_default: true后,构建集群时会自动在配置的私有仓库中拉取镜像
## 如果使用的是DockerHub镜像仓库,则可以省略url或将其设置为docker.io
## 如果使用内部公开仓库,则可以不用设置用户名和密码

#private_registries:
#  - url: registry.com
#    user: Username
#    password: password
#    is_default: true

# 堡垒机
## 如果集群节点需要通过堡垒机跳转,那么需要为RKE配置堡垒机信息
#bastion_host:
#  address: x.x.x.x
#  user: ubuntu
#  port: 22
#  ssh_key_path: /home/user/.ssh/bastion_rsa
## or
##   ssh_key: |-
##     -----BEGIN RSA PRIVATE KEY-----
##
##     -----END RSA PRIVATE KEY-----

# 设置Kubernetes集群名称
#默认情况下,集群的名称将是local。如果需要其他名称,可以使用cluster_name更改集群的名称,该名称将在集群生成的kubeconfig文件中显示。
cluster_name: dev-cluster

# 定义kubernetes版本.
## 目前, 版本定义需要与rancher/types defaults map相匹配: https://github.com/rancher/types/blob/master/apis/management.cattle.io/v3/k8s_defaults.go\#L14 (后期版本请查看: https://github.com/rancher/kontainer-driver-metadata/blob/master/rke/k8s_rke_system_images.go )
## 如果同时定义了kubernetes_version和system_images中的kubernetes镜像,则system_images配置将优先于kubernetes_version
# 使用命令行查看支持的版本:rke config --system-imagesrke config --system-images
kubernetes_version: v1.18.6-rancher1-1

# system_images优先级更高,如果没有单独指定system_images镜像,则会使用kubernetes_version对应的默认镜像版本。
## 默认Tags: https://github.com/rancher/types/blob/master/apis/management.cattle.io/v3/k8s_defaults.go\)\(Rancher v2.3或者RKE v0.3之后的版本请查看: https://github.com/rancher/kontainer-driver-metadata/blob/master/rke/k8s_rke_system_images.go )
#system_images:
#  etcd: rancher/coreos-etcd:v3.4.3-rancher1
#  alpine: rancher/rke-tools:v0.1.58
#  nginx_proxy: rancher/rke-tools:v0.1.58
#  cert_downloader: rancher/rke-tools:v0.1.58
#  kubernetes_services_sidecar: rancher/rke-tools:v0.1.58
#  kubedns: rancher/k8s-dns-kube-dns:1.15.0
#  dnsmasq: rancher/k8s-dns-dnsmasq-nanny:1.15.0
#  kubedns_sidecar: rancher/k8s-dns-sidecar:1.15.0
#  kubedns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1
#  coredns: rancher/coredns-coredns:1.6.5
#  coredns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1
#  nodelocal: rancher/k8s-dns-node-cache:1.15.7
#  kubernetes: rancher/hyperkube:v1.17.6-rancher2
#  flannel: rancher/coreos-flannel:v0.12.0
#  flannel_cni: rancher/flannel-cni:v0.3.0-rancher6
#  calico_node: rancher/calico-node:v3.13.4
#  calico_cni: rancher/calico-cni:v3.13.4
#  calico_controllers: rancher/calico-kube-controllers:v3.13.4
#  calico_ctl: rancher/calico-ctl:v3.13.4
#  calico_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4
#  canal_node: rancher/calico-node:v3.13.4
#  canal_cni: rancher/calico-cni:v3.13.4
#  canal_flannel: rancher/coreos-flannel:v0.12.0
#  canal_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4
#  weave_node: weaveworks/weave-kube:2.6.4
#  weave_cni: weaveworks/weave-npc:2.6.4
#  pod_infra_container: rancher/pause:3.1
#  ingress: rancher/nginx-ingress-controller:nginx-0.32.0-rancher1
#  ingress_backend: rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1
#  metrics_server: rancher/metrics-server:v0.3.6
#  windows_pod_infra_container: rancher/kubelet-pause:v0.1.4

services:
  etcd:
    # if external etcd is used
    # path: /etcdcluster
    # external_urls:
    #   - https://etcd-example.com:2379
    # ca_cert: |-
    #   -----BEGIN CERTIFICATE-----
    #   xxxxxxxxxx
    #   -----END CERTIFICATE-----
    # cert: |-
    #   -----BEGIN CERTIFICATE-----
    #   xxxxxxxxxx
    #   -----END CERTIFICATE-----
    # key: |-
    #   -----BEGIN PRIVATE KEY-----
    #   xxxxxxxxxx
    #   -----END PRIVATE KEY-----
    # Rancher 2用户注意事项:如果在创建Rancher Launched Kubernetes时使用配置文件配置集群,则kube_api服务名称应仅包含下划线。这仅适用于Rancher v2.0.5和v2.0.6。

    # 以下参数仅支持RKE部署的etcd集群
    # 开启自动备份
    backup_config:
      enabled: true           # 设置true启用ETCD自动备份,设置false禁用;
      interval_hours: 12      # 快照创建间隔时间,不加此参数,默认5分钟;
      retention: 6            # etcd备份保留份数;
#      # S3配置选项
#      s3backupconfig:
#        access_key: "myaccesskey"
#        secret_key:  "myaccesssecret"
#        bucket_name: "my-backup-bucket"
#        folder: "folder-name" # 此参数v2.3.0之后可用
#        endpoint: "s3.eu-west-1.amazonaws.com"
#        region: "eu-west-1"
    # 扩展参数
    extra_args:
      auto-compaction-retention: 240 #(单位小时)
      # 修改空间配额为$((6*1024*1024*1024)),默认2G,最大8G
      quota-backend-bytes: '6442450944'
      # 添加etcd监控地址
      listen-metrics-urls: 'http://0.0.0.0:2381'
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  kube-api:
    # cluster_ip范围,这必须与kube-controller中的service_cluster_ip_range匹配
    service_cluster_ip_range: 10.43.0.0/16
    # NodePort映射的端口范围
    #service_node_port_range: 0-32767
    service_node_port_range: 30000-32767
    # Pod安全策略
    pod_security_policy: false
    # kubernetes API server扩展参数,这些参数将会替换默认值
    extra_args:
      watch-cache: true
      default-watch-cache-size: 1500
      # 事件保留时间,默认1小时
      event-ttl: 1h0m0s
      # 默认值400,设置0为不限制,一般来说,每25~30个Pod有15个并行
      max-requests-inflight: 800
      # 默认值200,设置0为不限制
      max-mutating-requests-inflight: 400
      # kubelet操作超时,默认5s
      kubelet-timeout: 5s
      # 启用审计日志到标准输出
      audit-log-path: "-"
      # 增加删除workers的数量
      delete-collection-workers: 3
      # 将日志输出的级别设置为debug模式
      v: 4
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  # Rancher 2用户注意事项:如果在创建Rancher Launched Kubernetes时使用配置文件配置集群,则kube_controller服务名称应仅包含下划线。这仅适用于Rancher v2.0.5和v2.0.6。
  kube-controller:
    # Pods_ip范围
    cluster_cidr: 10.42.0.0/16
    # cluster_ip范围
    ## 这必须与kube-api中的service_cluster_ip_range相同
    service_cluster_ip_range: 10.43.0.0/16
    extra_args:
      # 修改每个节点子网大小(cidr掩码长度),默认为24,可用IP为254个;23,可用IP为510个;22,可用IP为1022个;
      node-cidr-mask-size: '24'

      # 控制器定时与节点通信以检查通信是否正常,周期默认5s
      node-monitor-period: '5s'
      ## 当节点通信失败后,再等一段时间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'

      # 默认5. 同时同步的deployment的数量。
      concurrent-deployment-syncs: 5
      # 默认5. 同时同步的endpoint的数量。
      concurrent-endpoint-syncs: 5
      # 默认20. 同时同步的垃圾收集器工作器的数量。
      concurrent-gc-syncs: 20
      # 默认10. 同时同步的命名空间的数量。
      concurrent-namespace-syncs: 10
      # 默认5. 同时同步的副本集的数量。
      concurrent-replicaset-syncs: 5
      # 默认5m0s. 同时同步的资源配额数。(新版本中已弃用)
      # concurrent-resource-quota-syncs: 5m0s
      # 默认1. 同时同步的服务数。
      concurrent-service-syncs: 1
      # 默认5. 同时同步的服务帐户令牌数。
      concurrent-serviceaccount-token-syncs: 5
      # 默认5. 同时同步的复制控制器的数量
      #concurrent-rc-syncs: 5
      # 默认30s. 同步deployment的周期。
      deployment-controller-sync-period: 30s
      # 默认15s。同步PV和PVC的周期。
      pvclaimbinder-sync-period: 15s
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  kubelet:
    # 集群搜索域
    cluster_domain: cluster.local
    # 内部DNS服务器地址
    cluster_dns_server: 10.43.0.10
    # 禁用swap
    fail_swap_on: false
    # 扩展变量
    extra_args:
      # 支持静态Pod。在主机/etc/kubernetes/目录下创建manifest目录,Pod YAML文件放在/etc/kubernetes/manifest/目录下
      pod-manifest-path: "/etc/kubernetes/manifest/"
      root-dir:  "/var/lib/kubelet"
      docker-root: "/u01/install/docker"
      # 指定pause镜像
      pod-infra-container-image: 'rancher/pause:3.1'
      # 传递给网络插件的MTU值,以覆盖默认值,设置为0(零)则使用默认的1460
      network-plugin-mtu: '1500'
      # 修改节点最大Pod数量
      max-pods: "250"
      # 密文和配置映射同步时间,默认1分钟
      sync-frequency: '3s'
      # Kubelet进程可以打开的文件数(默认1000000),根据节点配置情况调整
      max-open-files: '2000000'
      # 与apiserver会话时的并发数,默认是10
      kube-api-burst: '30'
      # 与apiserver会话时的 QPS,默认是5,QPS = 并发量/平均响应时间
      kube-api-qps: '15'
      # kubelet默认一次拉取一个镜像,设置为false可以同时拉取多个镜像,
      # 前提是存储驱动要为overlay2,对应的Dokcer也需要增加下载并发数,参考[docker配置](/rancher2x/install-prepare/best-practices/docker/)
      serialize-image-pulls: 'false'
      # 拉取镜像的最大并发数,registry-burst不能超过registry-qps ,
      # 仅当registry-qps大于0(零)时生效,(默认10)。如果registry-qps为0则不限制(默认5)。
      registry-burst: '10'
      registry-qps: '0'
      cgroups-per-qos: 'true'
      cgroup-driver: 'cgroupfs'

      # 节点资源预留
      enforce-node-allocatable: 'pods'
      system-reserved: 'cpu=0.25,memory=200Mi'
      kube-reserved: 'cpu=0.25,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,nodefs.available=2m,imagefs.available=2m,nodefs.inodesFree=2m'
      eviction-max-pod-grace-period: '30'
      eviction-pressure-transition-period: '30s'
      # 指定kubelet多长时间向master发布一次节点状态。注意: 它必须与kube-controller中的nodeMonitorGracePeriod一起协调工作。(默认 10s)
      node-status-update-frequency: 10s
      # 设置cAdvisor全局的采集行为的时间间隔,主要通过内核事件来发现新容器的产生。默认1m0s
      global-housekeeping-interval: 1m0s
      # 每个已发现的容器的数据采集频率。默认10s
      housekeeping-interval: 10s
      # 所有运行时请求的超时,除了长时间运行的 pull, logs, exec and attach。超时后,kubelet将取消请求,抛出错误,然后重试。(默认2m0s)
      runtime-request-timeout: 2m0s
      # 指定kubelet计算和缓存所有pod和卷的卷磁盘使用量的间隔。默认为1m0s
      volume-stats-agg-period: 1m0s

    # 可以选择定义额外的卷绑定到服务
    extra_binds: []
      #- "/usr/libexec/kubernetes/kubelet-plugins:/usr/libexec/kubernetes/kubelet-plugins"
      #- "/etc/iscsi:/etc/iscsi"
      #- "/sbin/iscsiadm:/sbin/iscsiadm"
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  kubeproxy:
    extra_args:
      # 默认使用iptables进行数据转发,如果要启用ipvs,则此处设置为ipvs
      proxy-mode: "ipvs"
      # 与kubernetes apiserver通信并发数,默认10
      kube-api-burst: 20
      # 与kubernetes apiserver通信时使用QPS,默认值5,QPS=并发量/平均响应时间
      kube-api-qps: 10
    extra_binds: []
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"
  scheduler:
    extra_args: {}
    extra_binds: []
    # 扩展环境变量
    extra_env:
      - "TZ=Asia/Shanghai"

# 目前,只支持x509验证
## 您可以选择创建额外的SAN(主机名或IP)以添加到API服务器PKI证书。
## 如果要为control plane servers使用负载均衡器,这很有用。
#authentication:
#  strategy: "x509|webhook"
#  webhook:
#    config_file: "...."
#    cache_timeout: 5s
#  sans:
#    # 此处配置备用域名或IP,当主域名或者IP无法访问时,可通过备用域名或IP访问
#    - "192.168.1.100"
#    - "www.test.com"
authentication:
  strategy: "x509"
  sans:
    # 此处配置备用域名或IP,当主域名或者IP无法访问时,可通过备用域名或IP访问;控制平面节点名称和IP、localhost和127.0.0.1、kubernetes和IP(10.43.0.1)、kubernetes.default、kubernetes.default.svc、kubernetes.default.svc.cluster.local默认已经在列表中了。
# Kubernetes认证模式
## Use mode: rbac 启用 RBAC
## Use mode: none 禁用 认证
authorization:
  mode: rbac
# 如果要设置Kubernetes云提供商,需要指定名称和配置,非云主机则留空;
cloud_provider:
# Add-ons是通过kubernetes jobs来部署。 在超时后,RKE将放弃重试获取job状态。以秒为单位。
addon_job_timeout: 0
# 有几个网络插件可以选择:flannel、canal、calico,Rancher2默认canal;如果禁用,设置为none
network:
  # rke v1.0.4+ 可用,如果选择canal网络驱动,需要设置mtu为1450
  #  mtu: 1450  
  #  plugin: canal
  #  options:
  #    flannel_backend_type: "vxlan"
  plugin: calico
# 目前只支持nginx ingress controller
## 可以设置provider: none来禁用ingress controller
ingress:
  provider: nginx
  node_selector:
    ingress: true
# 配置dns上游dns服务器
## 可用rke版本 v0.2.0
dns:
  provider: coredns
  upstreamnameservers:
  - 114.114.114.114
  node_selector:
    dns: true
# 安装附加应用
## 所有附加应用都必须指定命名空间
#addons: |-
#    ---
#    apiVersion: v1
#    kind: Pod
#    metadata:
#      name: nginx-demo
#      namespace: default
#    spec:
#      containers:
#      - image: nginx:alpine
#        imagePullPolicy: IfNotPresent
#        name: alpine
#        ports:
#          - containerPort: 80
#
#addons_include:
#    - https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/rook-operator.yml
#    - https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/rook-cluster.yml
#    - /path/to/manifest
  • 安装集群

    rke up cluster.yml
    

官方文档

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

open