美文网首页
Kubernetes(v1.17.3) + KubeSphere

Kubernetes(v1.17.3) + KubeSphere

作者: 南城忆往 | 来源:发表于2020-12-16 16:56 被阅读0次

    Kubernetes、kubeSphere 部署说明

    官网的版本更新迭代速度很快,网上的部署资料参差不齐。能够完整跑起来的可谓凤毛麟角。基于此做个备忘。

    基础服务器列表

    基础服务器及版本

    从零开始,在干净的机器上安装 Docker、Kubernetes (使用 kubeadm)、Calico、Helm、NFS StorageClass,通过此备忘搭建一个学习环境的 Kubernetes集群,并在 Kubernetes 集群之上安装开源的 KubeSphere 容器平台可视化运营集群环境。

    • 为了部署一套能够正常使用的K8s环境。我将k8s的1.17.x、1.18.x、1.20.x版本都部署了一遍。后来发现kubeSphere最新版本不支持K8s的1.20.x。😓

    一、环境准备:

    • 三台及以上主机
    • 每台主机的主机名、Mac 地址、UUID 不相同
    • CentOS 7.x(本文用 7.6)
    • 每台机器最好有 2G 内存或以上
    • Control-plane/Master至少 2U 或以上
    • 各个主机之间网络相通
    • 禁用交换分区
    • 禁用 SELINUX
    • 关闭防火墙(也可以设置相关防火墙规则)

    如果不关闭防火墙需要开放的端口列表参考:

    Master节点 Worker节点

    先进行防火墙、交换分区设置

    # 为了方便本操作关闭了防火墙,也建议你这样操作
    systemctl stop firewalld
    systemctl disable firewalld
    
    # 关闭 SeLinux
    setenforce 0
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    
    # 关闭 swap
    swapoff -a
    yes | cp /etc/fstab /etc/fstab_bak
    cat /etc/fstab_bak |grep -v swap > /etc/fstab
    
    

    更换CentOS YUM源为阿里云yum源

    # 安装wget
    yum install wget -y
    # 备份
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    # 获取阿里云yum源
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    # 获取阿里云epel源
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    # 清理缓存并创建新的缓存
    yum clean all && yum makecache
    # 系统更新
    yum update -y
    

    时间同步:

    timedatectl
    timedatectl set-ntp true
    

    修改Hosts地址

    # 所有节点执行
    cat >> /etc/hosts << EOF
    10.211.55.5    master
    10.211.55.6    node01
    10.211.55.7    node02
    EOF
    

    二、Docker安装

    在每台机器上安装 Docker,我这里安装的是 docker-ce-20.10.1,具体步骤参考 CentOS 7.x 安装Docker或自行安装即可。

    修改Cgroup Driver

    需要将Docker 的 Cgroup Driver 修改为 systemd,不然在为Kubernetes 集群添加节点时会报如下错误:

    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

    查看docker当前的Cgroup Driver

    $ docker info|grep "Cgroup Driver"
      Cgroup Driver: cgroupfs
    

    需要将这个值修改为 systemd ,同时将registry替换成国内的仓库地址操作如下。

    # Setup daemon.
    cat > /etc/docker/daemon.json <<EOF
    {
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
        "max-size": "100m"
        },
        "storage-driver": "overlay2",
        "registry-mirrors":[
            "https://kfwkfulq.mirror.aliyuncs.com",
            "https://2lqq34jg.mirror.aliyuncs.com",
            "https://pee6w651.mirror.aliyuncs.com",
            "http://hub-mirror.c.163.com",
            "https://docker.mirrors.ustc.edu.cn",
            "https://registry.docker-cn.com"
        ]
    }
    EOF
    
    mkdir -p /etc/systemd/system/docker.service.d
    
    # 重启docker.
    systemctl daemon-reload
    systemctl restart docker
    
    

    三、 安装kubeadm、kubelet 和 kubectl

    • kubeadm:用来初始化集群的指令
    • kubelet:在集群中的每个节点上用来启动 pod 和容器等
    • kubectl:用来与集群通信的命令行工具(Worker 节点可以不装)

    更改源地址

    # 所有节点执行
    
    # 配置K8S的yum源 这部分用是阿里云的源,如果可以访问Google,则建议用官方的源,官方源参考下面的配置。两个配置选其一即可。
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    

    官网源

    # 官方源配置如下
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF
    
    

    开始安装

    安装指定版本 kubelet、 kubeadm 、kubectl,这里安装的是 Kubernetes 1.17.3,如果选择的版本不一样,在执行集群初始化的时候,注意 –kubernetes-version 的值是你的对应版本。

    # 增加配置
    cat <<EOF > /etc/sysctl.d/k8s.conf
    net.ipv4.ip_forward=1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    # 加载
    sysctl --system
    
    # 安装
    yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3 --disableexcludes=kubernetes
    
    # 启动并设置 kubelet 开机启动
    systemctl start kubelet
    systemctl enable --now kubelet
    

    ⚠️ 如果安装K8s的最新版本,请检查KubeSphere是否支持该版本

    四、Kubeadm创建集群

    初始化 Control-plane/Master 节点

    在master节点上使用 kubeadm init 命令执行初始化。首先会执行一系列的运行前检查来确保机器满足运行 Kubernetes 的条件,这些检查会抛出警告并在发现错误的时候终止整个初始化进程。 一切就绪后kubeadm init 会下载并安装集群的 Control-plane 组件。

    # master节点执行
    
    kubeadm init \
     --apiserver-advertise-address 0.0.0.0 \
     --apiserver-bind-port 6443 \
     --cert-dir /etc/kubernetes/pki \
     --control-plane-endpoint master \
     --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
     --kubernetes-version 1.17.3 \ 
     --pod-network-cidr 10.10.0.0/16 \
     --service-cidr 10.20.0.0/16 \
     --service-dns-domain cluster.local \
     --upload-certs
    

    参数介绍

    # 初始化 Control-plane/Master 节点
    kubeadm init \
        --apiserver-advertise-address 0.0.0.0 \
        # API 服务器所公布的其正在监听的 IP 地址,指定“0.0.0.0”以使用默认网络接口的地址
        # 切记只可以是内网IP,不能是外网IP,如果有多网卡,可以使用此选项指定某个网卡
        --apiserver-bind-port 6443 \
        # API 服务器绑定的端口,默认 6443
        --cert-dir /etc/kubernetes/pki \
        # 保存和存储证书的路径,默认值:"/etc/kubernetes/pki"
        --control-plane-endpoint master \
        # 为控制平面指定一个稳定的 IP 地址或 DNS 名称,
        # 这里指定的 master 已经在 /etc/hosts 配置解析为本机IP
        --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
        # 选择用于拉取Control-plane的镜像的容器仓库,默认值:"k8s.gcr.io"
        # 因 Google被墙,这里选择国内仓库
        --kubernetes-version 1.17.3 \
        # 为Control-plane选择一个特定的 Kubernetes 版本, 默认值:"stable-1"
        --node-name master01 \
        #  指定节点的名称,不指定的话为主机hostname,默认可以不指定
        --pod-network-cidr 10.10.0.0/16 \
        # 指定pod的IP地址范围
        --service-cidr 10.20.0.0/16 \
        # 指定Service的VIP地址范围
        --service-dns-domain cluster.local \
        # 为Service另外指定域名,默认"cluster.local"
        --upload-certs
        # 将 Control-plane 证书上传到 kubeadm-certs Secret
    
    

    等待一段时间....

    Your Kubernetes control-plane has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
      #  ⚠️⚠️⚠️ 这部分后面会用到!!!
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    You can now join any number of the control-plane node running the following command on each as root:
    
    # ⚠️⚠️⚠️ 添加集群master节点的需要执行的命令
      kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \
        --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f \
        --control-plane --certificate-key 528b0b9f2861f8f02dfd4a59fc54ad21e42a7dea4dc5552ac24d9c650c5d4d80
    
    Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
    As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
    "kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
    
    Then you can join any number of worker nodes by running the following on each as root:
    
    # ⚠️⚠️⚠️ 添加集群work节点需要执行的命令
    kubeadm join kuber4s.api:6443 --token 0j287q.jw9zfjxud8w85tis \
        --discovery-token-ca-cert-hash sha256:5e8bcad5ec97c1025e8044f4b8fd0a4514ecda4bac2b3944f7f39ccae9e4921f
    
    

    为普通用户添加 kubectl 运行权限,命令内容在初始化成功后的输出内容中可以看到。

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

    将master节点上的$HOME/.kube/config 文件拷贝到node节点对应的文件中

    # 在node01、node02节点分别执行一遍如下命令
    
    1.创建目录,这里的路径为/root
    mkdir -p $HOME/.kube 
    
    2.把master节点上的config文件拷贝到node1和node2的$HOME/.kube
    scp k8s-master1:~/.kube/config $HOME/.kube
    
    3.修改权限
    chown $(id -u):$(id -g) $HOME/.kube/config
    

    这样修改后,在所有节点上执行kubctl命令时,不会出现如下错误:

    The connection to the server localhost:8080 was refused - did you specify the right host or port?

    备份好 kubeadm init 输出中的 kubeadm join 命令,集群添加节点时会执行该命令。也可以通过如下命令查看token信息

    # 在master节点使用如下命令查看token
    $ kubeadm token list
    TOKEN                     TTL       EXPIRES                     USAGES                   DESCRIPTION   EXTRA GROUPS
    px979r.mphk9ee5ya8fgy44   20h       2020-03-18T13:49:48+08:00   authentication,signing   <none>        system:bootstrappers:kubeadm:default-node-token
                
                
    # 查看sha256
    $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    # 5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51
    
    # 同时查看token和sha256
    $ kubeadm token create --print-join-command
    kubeadm join 10.211.55.5:6443 --token 9b28zg.oyt0kvvpmtrem4bg     --discovery-token-ca-cert-hash sha256:5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51
    

    将Node01、Node02加入到集群中

    # 在Node01、Node02 分别执行如下命令将work节点加入集群。
    
    kubeadm join 10.211.55.5:6443 --token 9b28zg.oyt0kvvpmtrem4bg     --discovery-token-ca-cert-hash sha256:5e7c7cd1cc1f86c0761e54b9380de22968b6b221cb98939c14ab2942223f6f51
    
    
    # 输出:
    输出结果  
    [preflight] Running pre-flight checks
        [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
    [preflight] Reading configuration from the cluster...
    [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
    [kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.16" ConfigMap in the kube-system namespace
    [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    [kubelet-start] Activating the kubelet service
    [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
    
    This node has joined the cluster:
    * Certificate signing request was sent to apiserver and a response was received.
    * The Kubelet was informed of the new secure connection details.
    
    Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
    

    Master节点查看node,发现状态都是NotReady,因为还没有安装网络插件,这里我们安装calio

    kubectl get nodes
    NAME         STATUS     ROLES    AGE     VERSION
    master    NotReady   master   19m     v1.16.9
    node01    NotReady   <none>   4m10s   v1.16.9
    node02    NotReady   <none>   4m3s    v1.16.9
    
    

    Master节点安装网络插件

    • 安装Pod网络插件,以使Pod可以相互通信,只需要在Master节点操作,其他新加入的节点会自动创建相关pod。
    • 注意需要在部署应用程序之前部署网络组件。另外,在安装网络之前,CoreDNS将不会启动(你可以通过命令 kubectl get pods –all-namespaces|grep coredns 查看 CoreDNS 的状态)。
    # 查看 CoreDNS 的状态,并不是 Running 状态
    $ kubectl get pods --all-namespaces|grep coredns
    kube-system   coredns-7f9c544f75-bzksd    0/1   Pending   0     14m
    kube-system   coredns-7f9c544f75-mtrwq    0/1   Pending   0     14m
    
    

    kubeadm 支持多种网络插件,我们选择 Calico 网络插件(kubeadm 仅支持基于容器网络接口(CNI)的网络),默认情况下,它给出的pod的IP段地址是 192.168.0.0/16 ,如果你的机器已经使用了此IP段,就需要修改这个配置项,将其值改为在初始化 Master 节点时使用 kubeadm init –pod-network-cidr=x.x.x.x/x 的IP地址段,即我们上面配置的 10.10.0.0/16(根据自己需求修改,但是注意要一致),大概在625行左右,操作如下:

    # 下载文件
    mkdir calico && cd calico
    wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
      
    # 修改配置文件
    # 找到 625 行左右的 192.168.0.0/16 ,并修改为我们初始化时配置的 10.10.0.0/16
    vim calico.yaml
      
    # 修改完成后安装calico网络插件
    kubectl apply -f calico.yaml
    
    # 安装完成后稍等一会查看pods状态,可能有的节点还在下载镜像
    kubectl get pods -n kube-system
    
    NAME                                      READY   STATUS    RESTARTS   AGE
    calico-kube-controllers-dc6cb64cb-8sh59   1/1     Running   0          6m22s
    calico-node-89s9k                         1/1     Running   0          6m22s
    calico-node-dkt7w                         1/1     Running   0          6m22s
    calico-node-tgg2h                         1/1     Running   0          6m22s
    coredns-667f964f9b-7hrj9                  1/1     Running   0          33m
    coredns-667f964f9b-8q7sh                  1/1     Running   0          33m
    etcd-k8s-master                           1/1     Running   0          33m
    kube-apiserver-k8s-master                 1/1     Running   0          32m
    kube-controller-manager-k8s-master        1/1     Running   0          33m
    kube-proxy-b2r5d                          1/1     Running   0          12m
    kube-proxy-nd982                          1/1     Running   0          11m
    kube-proxy-zh6cz                          1/1     Running   0          33m
    kube-scheduler-k8s-master                 1/1     Running   0          32m
    
    
    # 查看node状态
    [root@k8s-master ~]# kubectl get nodes 
    NAME         STATUS   ROLES    AGE     VERSION
    master   Ready    master   31m     v1.16.9
    node1    Ready    <none>   9m46s   v1.16.9
    node2    Ready    <none>   9m22s   v1.16.9
    
    

    其他

    • kubeadm init 初始化 Kubernetes 主节点
    • kubeadm token 管理 kubeadm join 的令牌
    • kubeadm reset 将 kubeadm init 或 kubeadm join 对主机的更改恢复到之前状态,一般与 -f 参数使用
    • 移除 worker 节点
      正常情况下,你无需移除 worker 节点,如果要移除,在准备移除的 worker 节点上执行
    kubeadm reset -f
    
    • 或在Master上执行
    # 节点名称可以在master上通过kubectl get nodes获得
    kubectl delete node 节点名称
    

    到此一个简单的K8s集群部署完成了。其他版本也是类似操作。下篇文章将在此基础上部署KubeSphere管理k8s集群。

    相关文章

      网友评论

          本文标题:Kubernetes(v1.17.3) + KubeSphere

          本文链接:https://www.haomeiwen.com/subject/omgngktx.html