zoukankan      html  css  js  c++  java
  • kuadm搭建K8S集群

    1.K8s 采用Kubeadm搭建

    • Kubeadm 是 Kubernetes 官方提供的快速安装和初始化 Kubernetes 集群的工具
    • 阅读以下各组件与对象作用
    https://kubernetes.io/docs/concepts/
    https://kubernetes.io/docs/setup/independent/install-kubeadm/
    https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
    

    1.1环境要求

    环境 硬件
    centos7.6 CPU:2G 内存:2G

    1.2环境角色

    ip 角色 安装软件
    10.0.0.134 k8s-Master kube-apiserver
    kube-schduler
    kube-controller-manager
    docker
    flannel
    kubelet
    10.0.0.135 k8s-node01 kubelet
    kube-proxy
    docker
    flannel

    1.3环境初始化

    • 所有机器关闭防火墙
    systemctl stop firewalld && systemctl disable firewalld
    
    • 所有机器关闭selinux
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config  && setenforce 0
    
    • 关闭swap分区
    # 临时关闭
    swapoff -a
    # 永久关闭
    sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
    
    
    echo "vm.swappiness = 0">> /etc/sysctl.conf
    sysctl -p
    
    • 设置本机host
    # master节点运行如下
    hostnamectl set-hostname k8s-master
    # node01节点运行如下
    hostnamectl set-hostname k8s-node01
    
    # 刷新
    bash
    
    • master机器/etc/hosts 添加dnfs映射
    cat >> /etc/hosts << EOF
    10.0.0.137 k8s-master
    10.0.0.138 k8s-node01
    10.0.0.139 k8s-node02
    EOF
    
    • 将桥接的IPv4流量传递到iptables的链
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    
    sysctl --system
    
    • 配置软件源
    cd /etc/yum.repos.d
    mv CentOS-Base.repo CentOS-Base.repo.bak
    mv epel.repo  epel.repo.bak
    curl https://mirrors.aliyun.com/repo/Centos-7.repo -o CentOS-Base.repo 
    sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/CentOS-Base.repo
    curl https://mirrors.aliyun.com/repo/epel-7.repo -o epel.repo
    
    
    • 配置配置kubernetes源为阿里的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=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    • 更新缓存
    yum clean all && yum makecache && yum repolist
    
    • 时间同步
    yum install ntpdate -y
    ntpdate time.windows.com
    

    1.4 安装docker

    • 安装gcc

      yum -y install gcc
      yum -y install gcc-c++
      
    • 卸载旧的版本

      sudo yum remove docker 
                        docker-client 
                        docker-client-latest 
                        docker-common 
                        docker-latest 
                        docker-latest-logrotate 
                        docker-logrotate 
                        docker-engine
      
    • 安装需要软件包

      yum install -y yum-utils device-mapper-persistent-data lvm2
      
    • master 和 node 安装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
    
    • yum 镜像加速
    cat > /etc/docker/daemon.json << EOF
    {
    	"registry-mirrors":["https://4b6uops9.mirror.aliyuncs.com"]
    }
    EOF
    
    • master 和 node 节点启动docker 。 并设置开机自启动
    systemctl enable docker && systemctl start docker
    
    • 检查
    docker --version
    

    1.5安装 kubeadm,kubelet和kubectl

    • 这里拉取是1.15版本
    yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
    

    1.Kubelet: 负责与其他节点集群通信,并进行本节点Pod和容器生命周期管理

    2.Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率

    3.Kubectl是Kubernetes集群管理工具

    • 启动kubelet
    systemctl enable kubelet --now
    
    • 查看一下kubeadm版本
    kubeadm version
    
    kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:30:03Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
    

    1.6K8s Master部署

    kubeadm init 
    --apiserver-advertise-address=10.0.0.134 
    --image-repository registry.aliyuncs.com/google_containers 
    --kubernetes-version v1.15.0 
    --service-cidr=10.1.0.0/16 
    --pod-network-cidr=10.244.0.0/16
    
    # 这里apiserve=10.0.0.134 是master节点ip
    
    
    #master节点部署1.20.0
    
    kubeadm init 
    --apiserver-advertise-address=10.0.0.137 
    --image-repository registry.aliyuncs.com/google_containers 
    --kubernetes-version v1.20.0 
    --service-cidr=10.96.0.0/12 
    --pod-network-cidr=10.244.0.0/16 
    --ignore-preflight-errors=all
    
    # kubeadm init 创建master节点
    # --apiserver-advertise-address 与node节点通信ip
    # --image-repository 指定镜像仓库
    # --kubernetes-version k8s的版本
    # --service-cidr service网段 暴露pod虚拟ip的网段
    # --pod-network-cidr pod配置的ip网段
    # --ignore-preflight-errors 忽略与检查错误
    
    # 这里apiserve=10.0.0.137 是master节点ip
    
    • kubeadm init 这里首先【preflight】做了下环境检查,检查完毕后从配置仓库地址拉取镜像,然后【certs】创建证书目录/etc/kubernetes/pki/,并生成证书。然后【kubeconfig】创建连接apiserver的配置文件目录在/etc/kubernetes, 【kube-start】生成kubelet配置文件并且启动, 【control-plane】 使用静态pod启动master组件/etc/kubernetes/mainfests, 【upload-config】,【upload-certs】,【kubelet 】使用ConfigMap存储kubelet配置。 【mark-control-planne】 给master节点添加标签。

      通过【bootstrap-token 】kubelet自动申请证书,【addons】安装插件CoreDNS和kube-proxy

    • 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

    • 根据输出提示操作:

    [root@k8s-master ~]# mkdir -p $HOME/.kube
    [root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    [root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

    1.7 K8s Node节点注册Master

    上面根据输出提示输入指令会生成如下内容
    kubeadm join 10.0.0.137:6443 --token s6y5ca.7z7v11jhxlp8xvin 
        --discovery-token-ca-cert-hash sha256:ad471efbaa32a0246099031e7439bee4e1b0ac29a811ada3d838c9b014e49460 
    
    
    # node执行即可
    

    默认token的有效期为24小时,当过期之后,该token就不可用了

    • 如果提示错误:[kubeadm 报错 error execution phase preflight: couldn’t validate the identity of the API Server: abort connecting to API ...
    # 在master重新生成token
    [root@k8s-master ~]# kubeadm token create
    4fa1sg.rtmdm0zvaz9xgvgi
    [root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    ad471efbaa32a0246099031e7439bee4e1b0ac29a811ada3d838c9b014e49460
    
    
    # node节点加入集群
    kubeadm join 10.0.0.137:6443 --token 4fa1sg.rtmdm0zvaz9xgvgi 
        --discovery-token-ca-cert-hash sha256:ad471efbaa32a0246099031e7439bee4e1b0ac29a811ada3d838c9b014e49460
    
    • 后续有nodes节点加入,解决方法如下: 步骤:
    # 0.重新生成新的token
    	kubeadm token create
    
    # 1.master节点查看token:
    kubeadm token list
    
    TOKEN		v2t93e.t8fnw16slsjtj5jc# 记住它
    TTL			23h
    EXPIRES	     2021-04-16T15:10:11+08:00  
    USAGES		authentication,signing
    DESCRIPTION  The default bootstrap token generated by 'kubeadm init'.                                         EXTRA GROUPS  system:bootstrappers:kubeadm:default-node-token
    
    # 2.master节点生成密钥
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    
    # 此时会生成: 4fa53fd3b654db36c930152dd71704c1da8707f217a63801caebbb1a0af86022
    
    # 3.node节点加入集群 10.0.0.134 为Master节点
    # 先清理环境:
    kubeadm reset
    # 加入:
    kubeadm join 10.0.0.134:6443 --token j3dhvb.oowj54et7l1tsruv --discovery-token-ca-cert-hash sha256:4fa53fd3b654db36c930152dd71704c1da8707f217a63801caebbb1a0af86022
    
                
    
    • 这里记录几个node加入节点错误:

      • 错误1:[ERROR Swap]: running with swap on is not supported. Please disable swap

        # 关闭swapoff
        swapoff -a
        # 注释配置
        vi /etc/fstab
        # 注释掉 /dev/mapper/centos-swap
        # 重启
        init 6
        
      • 错误2:error execution phase preflight: couldn't validate the identity of the API Server: encoding/hex: odd length hex string

        # master重新生成密钥即可
        openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
        
      • 错误3:[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: ``/etc/kubernetes/kubelet``.conf already exists

        rm -f /etc/kubernetes/kubelet.conf 
        rm -f /etc/kubernetes/pki/ca.crt
        # 然后重新join
        
    • master节点查看加入节点信息

      kubectl get nodes
      

    1.8安装网络插件

    • 这里在master执行, 获取kube-flannel.yml

      wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
      
    • 这里需要编辑kube-flannel.yml文件,原因是国内有可能访问不了quay.io这个registery

      vim kube-flannel.yml
      

      修改106 120行内容 
      

    • master加载kube-flannel.yml文件配置:

      kubectl apply -f kube-flannel.yml
      
    • master查看flannel执行状态

      [root@k8s-master ~]# ps -ef|grep flannel
      root      26595  26580  1 16:07 ?        00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
      
    • 节点信息查看

      kubectl get nodes# 节点查看
      kubectl get pod -n kube-system# 运行状态查看
      
    • 如果在执行kubectl get pod -n kube-system 所有执行状态为1/1方位正常,如果存在0/1情况,应该如下重复操作

      # 删除加载kube-flannel.yml
      kubectl delete -f kube-flannel.yml
      # 重新wget, 修改镜像配置
      # 执行
      kubectl apply -f kube-flannel.yml
      

    1.9 验证

    • master 新增一个pod, 对外暴漏80 端口

      # 创建pod
      kubectl create deployment nginx --image=nginx
      # nginx暴漏80
      kubectl expose deployment nginx --port=80 --type=NodePort
      #
      
    • 查看podsservice

      [root@k8s-master ~]# kubectl get pods,svc
      NAME                         READY   STATUS              RESTARTS   AGE
      pod/nginx-554b9c67f9-vrjcf   0/1     ContainerCreating   0          57s
      
      NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
      service/kubernetes   ClusterIP   10.1.0.1      <none>        443/TCP        63m
      service/nginx        NodePort    10.1.23.175   <none>        80:31459/TCP   27s
      
    • 访问http://10.0.0.134:31459/,显示如下成功:

    1.10 Dashboard 可视化

    • 获取kubernetes-dashboard.yaml配置文件

      wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
      
    • 修改:

    改为:lizhenliang/kubernetes-dashboard-amd64:v1.10.1
    
    • 新增:

    • master执行:
    kubectl apply -f kubernetes-dashboard.yaml
    
    • 访问http://10.0.0.134:30001/,显示如下成功: 谷歌因为受信任问题无法访问,用火狐访问

    • 创建service account并绑定默认cluster-admin管理员集群角色
    kubectl create serviceaccount cluster-admin -n kube-system
    # 名字叫cluster-admin
    
    • 将创建账号进行权限绑定
    kubectl create clusterrolebinding cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:cluster-admin
    # cluster-admin 具有超级管理员的权限
    
    • 这里使用token认证,我们执行命令拿去token
    kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/cluster-admin/{print $1}')
    
    • 令牌登录

    • 其他操作:删除签名
    kubectl delete clusterrolebindings cluster-admin
    
    • 其他浏览器访问不受信任问题解决
    [root@k8s-master ~]# cd /etc/kubernetes/pki/
    [root@k8s-master pki]# mkdir ui
    [root@k8s-master pki]# cp apiserver.crt  ui/
    [root@k8s-master pki]# cp apiserver.key  ui/
    [root@k8s-master pki]# cd ui/
    [root@k8s-master ui]# mv apiserver.crt dashboard.pem
    [root@k8s-master ui]# mv  apiserver.key   dashboard-key.pem
    [root@k8s-master ui]# kubectl delete secret kubernetes-dashboard-certs -n kube-system
    [root@k8s-master ui]# kubectl create secret generic kubernetes-dashboard-certs --from-file=./ -n kube-system
    
    [root@k8s-master]# vim kubernetes-dashboard.yaml #回到这个yaml的路径下修改
    修改 dashboard-controller.yaml 文件,在args下面增加证书两行
              - --tls-key-file=dashboard-key.pem
              - --tls-cert-file=dashboard.pem
    [root@k8s-master ~]kubectl apply -f kubernetes-dashboard.yaml
    [root@k8s-master ~]# kubectl create serviceaccount dashboard-admin -n kube-system
    serviceaccount/dashboard-admin created
    [root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin
    --serviceaccount=kube-system:dashboard-admin
    [root@k8s-master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
    Name:
    
    • 彻底卸载kubeadm
    #!/bin/bash
    kubeadm reset -f
    modprobe -r ipip
    lsmod
    rm -rf ~/.kube/
    rm -rf /etc/kubernetes/
    rm -rf /etc/systemd/system/kubelet.service.d
    rm -rf /etc/systemd/system/kubelet.service
    rm -rf /usr/bin/kube*
    rm -rf /etc/cni
    rm -rf /opt/cni
    rm -rf /var/lib/etcd
    rm -rf /var/etcd
    yum -y remove kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
    
  • 相关阅读:
    Hibernate动态更新
    Spring MVC实现文件上传
    windows 常用命名
    有用的SQL查询
    SQL语句、EF DataAnnotation和EF Fluent API方式创建联合主键
    EF6学习笔记三十二:性能优化——实体缓存和翻译缓存
    EF6学习笔记三十一:性能优化(二)
    EF6学习笔记三十:性能优化——预编译视图
    EF6学习笔记二十九:并发冲突(三)
    EF6学习笔记二十八:并发冲突(二)
  • 原文地址:https://www.cnblogs.com/xujunkai/p/14698450.html
Copyright © 2011-2022 走看看