zoukankan      html  css  js  c++  java
  • 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集群能够成功运行了

  • 相关阅读:
    Django对静态文件的处理——部署阶段
    使用Django来处理对于静态文件的请求
    Django1.7如何配置静态资源访问
    Spring WebSocket中403错误解决
    FastJSON JSONObject 字段排序 Feature.OrderedField
    国际化(i18n) 各国语言缩写
    【转】java.io.Closeable接口
    【转】spring bean 卸载
    This content should also be served over HTTPS
    Failed to close the ServletOutputStream connection cleanly, Broken pipe
  • 原文地址:https://www.cnblogs.com/imstrive/p/11409008.html
Copyright © 2011-2022 走看看