• K8S之集群搭建


    转自声明

    ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    1.K8S环境搭建的几种方式

    搭建K8S环境有几种常见的方式如下:

    (1)Minikube

    Minikube是一个工具,可以在本地快速运行一个单点的K8S,供初步尝试K8S或日常开发的用户使用,不能用于生产环境。

    (2)Kubeadm

    Kubeadm是K8S官方社区推出的一套用于简化快速部署K8S集群的工具,Kubeadm的设计目的是为新用户开始尝试K8S提供一种简单的方法。

    (3)二进制包

    除了以上两种方式外,我们还可以通过从官方下载二进制包,手动部署每个组件组成K8S集群,这也是目前企业生产环境中广为使用的方式,但对K8S管理人员的要求较高。

    本次学习实践我们主要借助Kubeadm工具搭建K8S集群,以便后续实践部署ASP.NET Core应用集群。

    2.搭建前的准备工作

    (1)准备三台Linux服务器

    这里我选择通过VMware Workstaion来搭建3个虚拟机,每个配置2CPU和2G内存,如下图:

      

    (2)配置主机名与静态IP地址如下表所示:

    角色 主机名 IP地址
    Master centos-master 192.168.198.111
    Node centos-node1 192.168.198.112
    Node centos-node2 192.168.198.113

    安装vim

    yum -y install vim*

    然后,更改hosts文件添加主机名与IP映射关系

    # vim /etc/hosts
    192.168.198.111 CentOS-Master
    192.168.198.112 CentOS-Node1
    192.168.198.113 CentOS-Node2
    (3)关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    (4)校正系统时间
    系统时间不一致,会导致node节点无法加入集群
    查看系统时间
    date
    
    

      安装ntp

    yum install -y ntp
    
    

    同步时间

    
    
    ntpdate cn.pool.ntp.org
    
    
    (5)关闭selinux
    sed -i 's/enforcing/disabled/' /etc/selinux/config
    setenforce 0
    (6)关闭swap => K8S中不支持swap分区
    vim /etc/fstab
    #/dev/mapper/centos-swap swap                    swap    defaults        0 0

    *.编辑etc/fstab将swap那一行注释掉或者删除掉

    (7)将桥接的IPv4流量传递到iptables的链

    # cat > /etc/sysctl.d/k8s.conf << EOF
       net.bridge.bridge-nf-call-ip6tables = 1
       net.bridge.bridge-nf-call-iptables = 1
       EOF
    
    # sysctl --system

    3.安装Docker&Kubeadm&Kubelet

     以下步骤请在所有节点中操作:

    3.1安装Docker

    # wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    # yum -y install docker-ce-18.06.1.ce-3.el7
    # systemctl enable docker && systemctl start docker
    # docker --version
    Docker version 18.06.1-ce, build e68fc7a

    如报错,请注意:

    安装wget

    yum -y install wget

    这里安装的是18.06社区版,如果你之前有安装低版本的Docker,为了配合本次实验的K8S版本(1.13.x),建议先卸载掉,卸载过程可以参考这篇文章《CentOS7 Docker升级》

    3.2添加阿里云Yum软件源

    # cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF

    3.3安装Kubeadm&Kubelet&Kubectl

    注意:本次部署K8S版本号为1.13.3

    yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3
    systemctl enable kubelet
    遇到的一些坑如下:

    ① 碰到需要kubernetes-cni的问题:

    #####错误:软件包:kubelet-1.13.3-0.x86_64 (kubernetes)
    需要:kubernetes-cni = 0.6.0
    可用: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes)
    kubernetes-cni = 0.3.0.1-0.07a8a2
    可用: kubernetes-cni-0.5.1-0.x86_64 (kubernetes)
    kubernetes-cni = 0.5.1-0
    可用: kubernetes-cni-0.5.1-1.x86_64 (kubernetes)
    kubernetes-cni = 0.5.1-1
    可用: kubernetes-cni-0.6.0-0.x86_64 (kubernetes)
    kubernetes-cni = 0.6.0-0
    正在安装: kubernetes-cni-0.7.5-0.x86_64 (kubernetes)
    kubernetes-cni = 0.7.5-0
    您可以尝试添加 --skip-broken 选项来解决该问题
    您可以尝试执行:rpm -Va --nofiles --nodigest
    解决:手动安装kubernetes-cni对应的版本
    yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0

    ② 使用yum安装程序时,提示xxx.rpm公钥尚未安装

    从 https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 检索密钥
    导入 GPG key 0xA7317B0F:
     用户ID     : "Google Cloud Packages Automatic Signing Key <gc-team@google.com>"
     指纹       : d0bc 747f d8ca f711 7500 d6fa 3746 c208 a731 7b0f
     来自       : https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    
    e3438a5f740b3a907758799c3be2512a4b5c64dbe30352b2428788775c6b359e-kubectl-1.13.3-0.x86_64.rpm 的公钥尚未安装
    
     失败的软件包是:kubectl-1.13.3-0.x86_64
     GPG  密钥配置为:https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

    解决:使用 yum install xxx.rpm --nogpgcheck 命令格式跳过公钥检查,比如跳过kubectl和kubeadm的公钥检查如下命令:

    yum install kubectl-1.13.3-0.x86_64 --nogpgcheck
    yum install kubeadm-1.13.3-0.x86_64 --nogpgcheck

    查看kubeadm、kubelet版本 

    kubelet --version
    kubeadm version

    3.4 部署Kubernetes Master

    以下步骤请在k8s-master节点上操作:

    kubeadm init 
    --apiserver-advertise-address=192.168.198.111 
    --image-repository registry.aliyuncs.com/google_containers 
    --kubernetes-version v1.13.3 
    --service-cidr=10.1.0.0/16 
    --pod-network-cidr=10.244.0.0/16

    PS:由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址(registry.aliyuncs.com/google_containers)。官方建议服务器至少2CPU+2G内存,当然内存1G也是可以的,但是会出Warning,建议还是老老实实升2G内存把。

      

    kubeadm join 192.168.198.111:6443 --token 0mruyg.dz1zman6uufgh5vt --discovery-token-ca-cert-hash sha256:0eac9042e16b8e410bb8b8e3a34afea5fe7bbd48591a2205d5eb47c1cce6bc32

    接下来,为了顺利使用kubectl命令,执行以下命令:

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

    这时你可以使用kubectl了,当你执行完kubectl get nodes之后,你会看到如下状态: 

    kubectl get nodes

       

    常见错误:

    the kubelet version is higher than the control plane version.

    yum -y remove kubelet
    yum install kubeadm-1.13.3-0.x86_64 --nogpgcheck
    yum install -y kubelet-1.13.3 --nogpgcheck

    3.5 部署Pod网络插件(CNI)

    同样,继续在k8s-master上操作:

    kubectl apply -f 
    https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

    然后通过以下命令验证:全部为Running则OK,其中一个不为Running,比如:Pending、ImagePullBackOff都表明Pod没有就绪  

    kubectl get pod --all-namespaces

     如果其中有的Pod没有Running,可以通过以下命令查看具体错误原因,比如这里我想查看kube-flannel-ds-amd64-8bmbm这个pod的错误信息:

    kubectl describe pod kube-flannel-ds-amd64-xpd82 -n kube-system

    在此过程中可能会遇到无法从qury.io拉取flannel镜像从而导致无法正常Running,解决办法如下:

    使用国内云服务商提供的镜像源然后通过修改tag的方式曲线救国

    docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
    docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
    docker rmi quay-mirror.qiniu.com/coreos/flannell:v0.11.0-amd64

    这时,我们再看看master节点的状态就会从NotReady变为Ready:
    kubectl get nodes

     

    那么,恭喜你,Master节点部署结束了。如果你只想要一个单节点的K8S,那么这里就完成了部署了。

    3.6 加入Kubernetes Node

     在两台Node节点上执行join命令:

    kubeadm join 192.168.2.100:6443 --token ekqxk2.iiu5wx5bbnbdtxsw --discovery-token-ca-cert-hash sha256:c50bb83d04f64f4a714b745f04682b27768c1298f331e697419451f3550f2d05
    这里需要注意的就是,带上在Master节点Init成功后输出的Token。如果找不到了,没关系,可以通过以下命令来查看:
    kubeadm token list 
    注:token默认有效期24小时,过期后使用该命令无法查看,可通过下面到方法修改
    kubeadm token create

    获取ca证书sha256编码hash值

    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

    Node节点上成功join之后会得到以下信息:

     这时,我们在master节点上执行以下命令可以看到集群各个节点的状态了:

     常见问题:

    证书已存在

     解决办法:删除相应目录下的证书文件,重新执行命令

    Downloading configuration for the kubelet from the "kubelet-config-1.15" ConfigMap in the kube-system namespace
    configmaps "kubelet-config-1.15" is forbidden: User "system:bootstrap:6w889o" cannot get resource "configmaps" in API group "" in the namespace "kube-system"

     

     这种提示一般是kubelet版本与kubeadm版本不一致导致,重新安装kubelet即可

     

    yum remove kubelet
    
    yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0

    kubectl get nodes

    如果看到两个Node状态不是Ready,那么可能需要检查哪些Pod没有正常运行:

    kubectl get pod --all-namespaces

      然后按照3.5中的检查方式进行检查并修复,最终kubectl get nodes效果应该状态都是Running。注意的是在检查时需要注意是哪个Node上的错误,然后在对应的Node进行修复,比如拉取flannel镜像。

      至此,一个最小化的K8S集群已经搭建完毕。

    常见异常:

    [Get https://192.168.198.111:6443/api/v1/namespaces/kube-public/configmaps/cluster-info: x509: certificate has expired or is not yet valid]

    更新系统时间,见第一步基本配置

    3.7 测试Kubernetes集群

    这里为了快速地验证一下我们的K8S集群是否可用,创建一个示例Pod:

    kubectl create deployment nginx --image=nginx
    kubectl expose deployment nginx --port=80 --type=NodePort
    kubectl get pod,svc

     

       如果想要看到更多的信息,比如pod被部署在了哪个Node上,可以通过 kubectl get pods,svc -o wide来查看。

    kubectl get pods,svc -o wide

     因为是NodePort方式,因此其映射暴露出来的端口号会在30000-32767范围内随机取一个,我们可以直接通过浏览器输入IP地址访问,比如这时我们通过浏览器来访问一下任一Node的IP地址加端口号,例如172.30.10.91:31063或172.30.10.92:31063  

     如果能够成功看到,那么恭喜你,你的K8S集群能够成功运行了

  • 相关阅读:
    9"边界匹配
    8劈分
    7替换
    5逻辑匹配
    4分组匹配
    3贪婪匹配与勉强匹配
    python多线程之线程传参
    多线程(类的形式)---线程同步
    多线程基础
    Linux----黑马程序员Linux教学视频简记(转载)
  • 原文地址:https://www.cnblogs.com/imstrive/p/11409008.html
Copyright © 2020-2023  润新知