zoukankan      html  css  js  c++  java
  • 项目实战篇【kubernetes】五 || kubernetes集群部署


    Kubernetes简称k8s,是Google开源的一个容器编排引擎,
    它支持自动化部署、大规模可伸缩、应用容器化管理。
    在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
    在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,
    实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

    kubernetes特点:

    • 可移植:支持共有云、私有云、混合云、多重云(多个公共云)
    • 可扩展:模块化、插件化、可挂载、可组合
    • 自动化:自动部署、自动重启、自动复制、自动伸缩/扩展

    kubernetes服务:

    • kubectl:用于管理k8s集群的命令行工具。
    • kube-apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
    • k8s master:集群主节点,主要由kub-apiserver、kube-scheduler、kube-controller-manager、etcd四个模块组成。
    • k8s node:集群子节点,主要由kubelet、kube-proxy、runtime三个模块组成。
    • Image Registry:镜像仓库。

    1、kubernetes管理节点部署

    1.1、部署k8s管理节点主机

    • YN100-22.host.com

    1.2、初始化管理节点

    导出配置文件

    cd /usr/local/kubernetes/cluster
    kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
    

    修改配置文件

    advertiseAddress: 192.168.100.22 #修改为本机IP地址
    imageRepository: registry.aliyuncs.com/google_containers #使用阿里云仓库
    podSubnet: "10.244.0.0/16" #添加该行配置,pod所在网段为我们虚拟机不重叠的网段(这里用flannel默认网段)
    kubernetesVersion: v1.15.4 #检查版本是否一致,更改为下载版本
    #配置文件末尾添加以下配置,默认的调度方式改为ipvs模式
     ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    featureGates:
      SupportIPVSProxyMode: true
    mode: ipvs
    

    alt 图片1

    alt 图片2

    查看所需安装的镜像

    kubeadm config images list --config kubeadm.yml
    

    alt 图片3

    各镜像作用

    [root@yn100-22 cluster]# kubeadm config images list --config kubeadm.yml
    registry.aliyuncs.com/google_containers/kube-apiserver:v1.15.4 #网关,提供restfull风格的api
    registry.aliyuncs.com/google_containers/kube-controller-manager:v1.15.4 #控制器管理,自动重启pod
    registry.aliyuncs.com/google_containers/kube-scheduler:v1.15.4 #调度
    registry.aliyuncs.com/google_containers/kube-proxy:v1.15.4 #代理
    registry.aliyuncs.com/google_containers/pause:3.1 #暂停
    registry.aliyuncs.com/google_containers/etcd:3.3.10 #服务注册与发现
    registry.aliyuncs.com/google_containers/coredns:1.3.1 #域名解析服务器
    

    拉取所需镜像

    kubeadm config images pull --config kubeadm.yml
    

    注意:镜像拉取速度较慢,作者已经提供下载好的镜像包,请关注公众号,发送关键字【k8s】或【kubernetes】获取镜像包下载地址,【QQ讨论群:883210148,作者微信:1136069753】

    执行初始化命令,该命令指定了初始化时需要使用的配置文件,其中添加--experimental-upload-certs参数可以在后续执行加入节点时自动分发证书,追加的tee kubeadm-init.log用以输出日志。

    kubeadm init --config=kubeadm.yml --experimental-upload-certs | tee kubeadm-init.log
    

    注意: 如果没有提前下载镜像,
    这条命令执行时会卡在[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
    大概需要2分钟,请耐心等待。安装k8s版本和下载的镜像版本不统一则会出现time out waiting for the condition错误,
    中途失败或是想修改配置可以使用kubeadm reset命令重置配置,在初始化操作。
    安装完后,会提示你输入如下命令,复制粘贴过来,执行即可。

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

    上面kubeadm init执行成功后会返回给你node节点加入集群的命令,等会要在node节点上执行,可以在kubeadm-init.log日志中查询,或者可以使用如下命令获取。

    kubeadm token create --print-join-command
    

    查看是否初始化成功

    kubectl get node
    

    alt 图片1

    显示以上结果,说明初始化成功,当前状态为NotReady,因为未进行网络配置。

    2、kubernetes工作节点部署

    2.1、部署k8s工作节点主机

    • YN100-31.host.com
    • YN100-32.host.com

    2.2、node节点加入集群

    将master节点初始化后返回的加入集群命令在node节点中执行,命令如下(示例):

    kubeadm join 192.168.100.22:6443 --token abcdef.0123456789abcdef 
        --discovery-token-ca-cert-hash sha256:4d9b000b6e202da14ad9cefb0aec87fcced40442b51b6d6f22816d83bec2e2aa 
    

    在master中执行命令kubectl get node,查看node节点是否成功加入集群,返回结果如下:

    alt 图片2

    3、网络配置

    上文提到的k8s状态为NotReady,说明节点之间还没有产生通讯,所以要进行网络配置。
    不同的容器平台都需要网络功能,它们之间的适配如果没有统一的标准,会有很大的工作量和重复劳动,
    而CNI 就是这样一个标准,它旨在为容器平台提供网络的标准化。不同的容器平台能够通过相同的接口调用不同的网络组件。kubernetes中的CNI插件主要有以下:

    • Flannel
    • Calico
    • Canal
    • Weave

    注意:网络插件选择一个进行安装,本教程对Flannel和Calico两个插件进行安装演示。

    3.1、部署网络插件主机

    • YN100-22.host.com

    3.2、安装网络插件Calico

    下载calico.yaml配置文件,Calico官方文档

    https://docs.projectcalico.org/manifests/calico.yaml
    

    注意:如果因网速原因不能下载,请关注公众号,发送关键字【k8s】或【kubernetes】获取全套资料下载地址,【QQ讨论群:883210148,作者微信:1136069753】

    找到配置文件中CALICO_IPV4POOL_CIDR,value值改为初始化kubernetes管理节点配置pod网段

    name: CALICO_IPV4POOL_CIDR
      value: "192.168.0.0/16"
    #修改-->
      value: "10.244.0.0/16"
    

    对资源进行配置

    kubectl apply -f calico.yaml
    

    查看calico是否部署成功。只有全部STATUS为Running才算安装完成。

    watch kubectl get pods --all-namespaces
    

    alt 图片5

    此时,执行kubectl get node命名,所有节点状态为Ready。

    [root@yn101-22 flannel]# kubectl get node
    NAME                STATUS   ROLES    AGE     VERSION
    yn100-22.host.com   Ready    master   30h     v1.15.4
    yn100-31.host.com   Ready    <none>   2m40s   v1.15.4
    yn100-32.host.com   Ready    <none>   2m35s   v1.15.4
    

    alt 图片6

    3.3、安装网络插件Flannel

    下载Flannel配置文件kube-flannel.yml,github地址如下:

    https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml
    

    对资源进行配置,flannel默认的pod网段为10.244.0.0/16,如果初始化设置为其他网段,同理进行更改。

    kubectl apply -f kube-flannel.yml
    

    查看Flannel是否部署成功。只有全部STATUS为Running才算安装完成。

    watch kubectl get pods --all-namespaces
    NAMESPACE     NAME                                        READY   STATUS     RESTARTS   AGE
    kube-system   coredns-bccdc95cf-nxs29                     1/1     Running    0          29h
    kube-system   coredns-bccdc95cf-ttngf                     1/1     Running    0          29h
    kube-system   etcd-yn101-22.host.com                      1/1     Running    0          29h
    kube-system   kube-apiserver-yn101-22.host.com            1/1     Running    0          29h
    kube-system   kube-controller-manager-yn101-22.host.com   1/1     Running    0          29h
    kube-system   kube-flannel-ds-amd64-p886d                 1/1     Running   0          28s
    kube-system   kube-proxy-jx4fc                            1/1     Running    0          29h
    kube-system   kube-scheduler-yn101-22.host.com            1/1     Running    0          29h
    

    此时,执行kubectl get node命名,所有节点状态为Ready。

    [root@yn101-22 flannel]# kubectl get node
    NAME                STATUS   ROLES    AGE     VERSION
    yn101-22.host.com   Ready    master   30h     v1.15.0
    yn101-31.host.com   Ready    <none>   2m40s   v1.15.0
    yn101-32.host.com   Ready    <none>   2m35s   v1.15.0
    

    3.4、安装网络插件过程问题解决

    查看所有pod,状态STATUS为pending、init、ImagePullBackOff

    [root@yn101-22 flannel]# kubectl get pods -n kube-system | grep -v Running
    NAME                                        READY   STATUS     RESTARTS   AGE
    coredns-bccdc95cf-nxs29                     0/1     Pending    0          30h
    coredns-bccdc95cf-ttngf                     0/1     Pending    0          30h
    kube-flannel-ds-amd64-p886d                 0/1     Init:0/1   0          14m
    

    根据NAME查看具体错误信息

    kubectl describe pod <NAME> -n kube-system
    

    在安装过程中大部门问题都是因为镜像下载失败导致,此时可以查看具体的镜像版本,使用docker拉取,检查是否为网络原因或没有对应的版本镜像。

    注意:如果因网速原因不能下载镜像包,请关注公众号,发送关键字【k8s】或【kubernetes】获取全套资料下载地址,【QQ讨论群:883210148,作者微信:1136069753】

    4、kubernetes各组件运行状态检查

    4.1、检查组件运行状态

    #1.16版本状态如下:
    [root@kubernates-node-01 kubernetes]# kubectl get cs
    NAME                 AGE
    controller-manager   <unknown>
    scheduler            <unknown>
    etcd-0               <unknown>
    #1.15版本状态如下:
    [root@localhost cni]# kubectl get cs
    NAME                 STATUS    MESSAGE             ERROR
    scheduler            Healthy   ok
    controller-manager   Healthy   ok
    etcd-0               Healthy   {"health":"true"}
    

    正常情况下显示状态为Healthy,在1.16版本中显示unknown,似乎没有太大影响,在1.17版本中已经解决了该问题。

    4.2、检查master状态

    [root@yn101-22 kubernetes]# kubectl cluster-info
    Kubernetes master is running at https://192.168.101.20:6443
    KubeDNS is running at https://192.168.101.20:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    

    4.3、检查node状态

    [root@yn101-22 kubernetes]# kubectl get nodes
    NAME                 STATUS   ROLES    AGE     VERSION
    kubernates-master    Ready    master   8h      v1.16.0
    kubernates-node-01   Ready    <none>   6h13m   v1.16.0
    kubernates-node-02   Ready    <none>   7h47m   v1.16.0
    

    4.4、node节点中kubectl命令无法使用

    [root@yn101-31 kubernetes]# kubectl get nodes
    #报错信息如下
    The connection to the server localhost:8080 was refused - did you specify the right host or port?
    

    原因:出现这个问题的原因是kubectl命令需要使用kubernetes-admin来运行。

    解决:将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下,然后配置环境变量:

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    #立即生效
    source ~/.bash_profile
    

    5、kubernetes移除管理节点

    #第一步:列出所有nodes
    kubectl get node
    #第二步:删除节点
    kubectl delete node node3
    #第三步:重重置配置
    kubeadm reset
    #第四步:重新加入集群
    

    6、学习交流QQ群【883210148】

    alt QQ群

    7、关注微信公众号,免费获取文档及资源

    alt 微信公众号

  • 相关阅读:
    zeplin使用教程
    如何卸载命令行全局安装的包
    webstrom快捷键
    更新npm至最新版本
    mac环境下安装react项目环境
    横向滚动条布局
    JAVA语法基础——动手动脑
    JAVA语言课堂测试
    暑假第八周进度报告
    暑假第七周进度报告
  • 原文地址:https://www.cnblogs.com/kevin-ying/p/13299977.html
Copyright © 2011-2022 走看看