• kubeadm部署k8s教程(2)---部署


    一、部署k8s常用的两种方式
    1. kubeadm
      kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速不是k8s集群。学习成本低。后期维护,略微有些难度。
    2. 二进制
      通过官方下载rmp包来部署。需要自己部署各种组件。目前企业应用最多。

    == 真正的生产环境采用那种方式部署呢?==

    二、安装要求
    1. 一台或多台机器(1个master,多个node),操作系统 CentOS7.8。
    2. 节点硬件配置:至少2C2G,至少硬盘30GB或更多。
    3. 集群中所有机器之间网络互通。
    4. 可以访问外网,需要拉取镜像。
    5. 禁止swap分区。swapof
      在这里插入图片描述
      在这里插入图片描述在这里插入图片描述
    三、系统设置

    本次规划两台机器:
    192.168.129.15(master)(可修改配置允许master运行node)
    192.168.130.41(node)

    cat >> /etc/hosts<<EOF
    192.168.129.15 k8s-master
    192.168.130.41 k8s-node1
    EOF

    hostnamectl set-hostname k8s-master
    bash
    hostnamectl set-hostname k8s-node1
    bash

    三、本次任务,使用kubeadm快速部署一个k8s集群
    1. 安装docker
      请移步centos7 安装docker
    2. 创建一个Master节点
      kubeadm init
    3. 将一个Node节点加入到当前集群中
      kubeadm join <Master节点的IP和端口>
    4. 部署容器网络(CNI)
      kubectl apply -f calico.yaml
    5. 部署WebUI(Dashboard)
    四、部署

    1、添加阿里云yum源

    cat > /etc/yum.repos.d/kubernetes.repo <<EOF
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 
    http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2、安装
    在每个节点,都执行如下指令。指定版本号安装。其中kubectl在master安装即可,node安装也无妨。

    yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4
    
    • 1

    设置自动启动

    systemctl enable kubelet
    
    • 1

    在这里插入图片描述
    == kubeadm不单纯是简化部署K8S集群,同时采用了容器化方式部署k8s组件。(只有kubelet不是采用容器化) ==

    3、部署master
    在master节点上执行如下指令:

    kubeadm init  --apiserver-advertise-address=192.168.129.15   --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version v1.19.4  --service-cidr=10.96.0.0/12  --pod-network-cidr=10.244.0.0/16  --ignore-preflight-errors=all
    
    • 1

    kubeadm init 创建一个master节点。
    –apiserver-advertise-address=192.168.129.15 :指定apiserver的地址,用于其他节点连接用的内网地址。
    –image-repository registry.aliyuncs.com/google_containers :镜像仓库,指定了阿里云的仓库。
    –kubernetes-version v1.19.4 版本
    –service-cidr=10.96.0.0/12 :用在service的网段。
    –pod-network-cidr=10.244.0.0/16:用在pod的网段。
    –ignore-preflight-errors=all: 忽略检查的一些错误。

    执行以上语句后,会依次做出如下的工作:
    a、检查环境:[preflight] Running pre-flight checks。如swap是否关闭等。
    b、拉取k8s部署所需要的镜像。
    c、创建证书。生成k8s正式和etcd证书。
    d、生成kubeconfig文件
    e、启动kubelet。
    f、部署管理节点组件,用镜像启动容器。
    通过如下指令,可以看到已经拉起的容器。

    kubectl get pods -n kube-system
    
    • 1

    在这里插入图片描述g、启动etcd
    h、上传配置文件、证书到k8s中。其他节点启动后会拉取配置文件进行启动。
    i、给master标记污点。告诉k8s,新创建的容器不允许分配到此接点上。

    执行成功后,会打印如下:
    在这里插入图片描述
    执行提示的语句,将连接集群的配置文件,copy到默认路径下。从而使用命令行管理工具去管理集群。

    mkdir -p $HOME/.kube
    cp /etc/kubernetes/admin.conf .kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    
    • 1
    • 2
    • 3

    4、部署node
    执行在master init之后,打印出来的语句

    kubeadm join 192.168.129.15:6443 --token 5rgh7r.68w97njomg1xzirt \
        --discovery-token-ca-cert-hash sha256:19a54b565efc450d704f9f45aed113e25535474d3d14b37965dafecf47b492b3 
    
    • 1
    • 2

    执行成功后,在master上执行查看所有节点,kubectl get node。可以看到注册进来的节点状态为NotReady。

     journalctl -u kubelet
    
    • 1

    在这里插入图片描述

    5、部署容器网络插件calico.
    在这里插入图片描述

    在所有节点上执行
    下载yaml文件。
    如官网下载不下来,可通过点击下载
    calico下载

    wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
    
    #修改节点内容,将值修改成,kubeadm init 时候指定的--pod-network-cidr节点内容.也就是pod网段
    vi calico.yaml
    # - name: CALICO_IPV4POOL_CIDR
    #              value: "10.244.0.0/16"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述应用:

    kubelet apply -f calico.yaml
    
    • 1

    查看要安装的镜像
    在这里插入图片描述
    部署之后,calico也会以容器的方式去启动.
    安装完成后,查看pods。
    kubectl get pods -n kube-system

    在这里插入图片描述
    验证pod工作。验证pod网络通信。验证DNS解析。
    在k8s集群中,创建一个pod,验证是否正常运行。
    kubectl create deployment nginx --image=nginx
    kubectl expose deployment nginx --port=80 --type=NodePort
    kubectl get pod,svc

    6、安装dashboard,只在master节点安装。
    下载yaml文件。

    wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml  --no-check-certificate
    
    • 1

    下载之后,在spec节点增加访问类型:type: NodePort。
    声明通过nodeport方式来访问dashboard。
    同时指定暴露端口为:30000

    在这里插入图片描述

    应用yaml文件

    kubectl apply -f recommended.yaml
    kubectl get pods -n kubernetes-dashboard
    
    #查看svc命名空间下的
    kubectl get pods,svc -n kubernetes-dashboard
    
    • 1
    • 2
    • 3
    • 4
    • 5

    替换重启指令,用于yaml文件有更新的情况,会删除已经创建的pods

    kubectl  replace --force -f recommended.yaml 
    
    • 1

    在这里插入图片描述在这里插入图片描述

    对外暴露端口为30000
    https://192.168.1.15:30000

    7、创建service account并绑定默认的cluster-admin管理员集群角色。
    通过指令创建:

    #创建用户
    kubectl create serviceaccount dashboard-admin -n kube-system
    #为用户授权
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    #获取用户的token用于登录
    kubectl  describe secrets -n kube-system $(kubectl -n kube-system get secret|awk '/dashboard-admin/{pring $1}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    找到创建的用户dashboard-admin节点,复制token作为登录依据:
    在这里插入图片描述

    通过yaml文件方式创建管理员,创建文件admin.yaml,内容如下:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding 
    metadata: 
      name: admin-user
      annotations:
        rbac.authorization.kubernetes.io/autoupdate: "true"
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: admin-user
      namespace: kube-system
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    kubectl create -f admin.yaml
    
    • 1

    由于有个pod状态不对,导致dashboard一直打不开
    在这里插入图片描述删除掉这个pod

    kubectl delete pod web-96d5df5c8-l5vsw
    
    kubectl  replace --force -f recommended.yaml 
    
    • 1
    • 2
    • 3

    可以看到,状态都正常了。
    在这里插入图片描述打开页面:
    在这里插入图片描述通过token登录,获取token见上面的方法

    kubectl  describe secrets -n kube-system $(kubectl -n kube-system get secret|awk '/dashboard-admin/{pring $1}')
    
    • 1

    找到
    dashboard-admin-token相关节点的token,存储下来登录时候用
    在这里插入图片描述

    8、使用deployment控制器部署镜像。deployment用来部署无状态应用,管理pod,部署、滚动、升级。

    kubectl create deployment web --image=nginx --replicas=1
    kubectl get deploy,pods
    
    • 1
    • 2

    查看日志:

    kubectl logs name
    
    • 1

    使用service将pod暴露出去

    kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
    kubectl get service
    
    • 1
    • 2

    端口是随机生成的,通过get svc获取。

    #查看service关联的pod
    kubectl  get endpoints
    
    #修改副本数量
    kubectl scale deployment web --replicas=5
    
    • 1
    • 2
    • 3
    • 4
    • 5

    升级示例:

    #把已创建的名为web的pod,由nginx升级为nginx1.15,升级要有新的版本的镜像
    kubectl set image deployment web nginx=nginx1.15
    
    • 1
    • 2

    回滚示例

    #查看历史版本:
    kubectl rollout history deployment web
    #还原到上一个版本:
    kubectl rollout undo deployment web
    #回滚到指定版本:
    kubectl rollout history deployment web --to-revision=版本号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    弹性伸缩:

    kubectl scale deployment web --replicas=10
    #10个副本
    
    • 1
    • 2

    9、部署service
    service的引入主要解决pod的动态变化,提供统一访问入口。可以防止pod失联(服务发现),定义一组pod的访问策略(负载均衡)。通过标签关联一组pod,为这一组pod提供负载均衡的能力。
    当pod滚动升级的时候,可以及时让前端感知到。
    在这里插入图片描述创建一个简单service,通过yaml文件创建。

    内部访问用yaml

    apiVersion: v1
    kind: Service      # 资源类型
    metadata:          # 元数据,基本属性和信息
      name: nginx  # service 的名称
    spec:              # 这是关于描述          
      type: ClusterIP #服务类型,ClusterIP,集群内容访问用。NodeIP,集群外部访问用
      ports:
      - port: 80 #service端口
        protocol: TCP
        targetPort: 80 #容器端口(应用程序监听端口)
      selector:            # 标签选择器
        app: nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    外部访问用yaml

    apiVersion: v1
    kind: Service      # 资源类型
    metadata:          # 元数据,基本属性和信息
      name: nginx  # service 的名称
    spec:              # 这是关于描述          
      type: NodePort #在每个节点上启用一个端口,来暴露服务,集群外部访问用。也会分配一个稳定的集群内部IP。
      ports:
      - port: 80 #service端口
        protocol: TCP
        targetPort: 80 #容器端口(应用程序监听端口)
        nodePort: 30001
      selector:            # 标签选择器
        app: nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    kubectl create -f nginx.yaml
    
    #查看pods的标签
    kubectl get pods --show-labels
    
    kubectl get pods -o wide
    
    #实时监控pods发现
    kubectl get ep -w
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    #查看service关联的一组pod。通过标签选择器去关联
    kubectl get ep
    
    #查询default空间的所有serice
    kubectl get service
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述由于不确定nginx这个service关联了哪些pods。导出yaml文件内容。通过如下指令查看关联的pods

     kubectl get service nginx -o yaml
    
    • 1

    在这里插入图片描述

    常用的services类型:
    1.clusterIp:一般集群内部进行使用
    2.nodePort:对外暴露应用时使用
    3.loadBalance:对外访问应用使用,用于公有云

  • 相关阅读:
    wsl中安装虚拟环境virtualenv,pycharm中配置wsl解释器
    汽车操纵稳定性matlab仿真
    使用CompletionService进行多个文件打包为zip下载
    Tomcat多实例部署和动静分离
    Spring注解驱动之@Resource注解和@Inject注解
    字节架构师谈微服务架构:Dubbo+Docker+SpringBoot+Cloud
    上周热点回顾(3.27-4.2)
    Harmony2.0开发—事件
    2022/8/13
    spring boot 整合vue,支持 element-ui , 开发工具: IDEA
  • 原文地址:https://blog.csdn.net/qq_26993175/article/details/125471307