• 搭建kubernete集群


    kubernetes 部署过程:

    1、基础环境准备 
    2、部署 harbor 及 haproxy 高可用反向代理 
    3、在所有 master 安装指定版本的 kubeadm 、kubelet、kubectl、docker 
    4、在所有 node 节点安装指定版本的 kubeadm 、kubelet、docker,在 node 节点 kubectl 为 可选安装,看是否需要在 node 执行 kubectl 命令进行集群管理及 pod 管理等操作。 
    5、master 节点运行 kubeadm init 初始化命令 
    6、验证 master 节点状态 
    7、在 node 节点使用 kubeadm 命令将自己加入 k8s master(需要使用 master 生成 token 认 证) 
    8、验证 node 节点状态 
    9、创建 pod 并测试网络通信 
    10、部署 web 服务 Dashboard 
    11、k8s 集群升级

    一、基础环境准备 

    1.1 各节点时间同步

    ntpdate ntp1.aliyun.com

    1.2 修改主机名

    192.168.134.101 master
    192.168.134.102 node01
    192.168.134.91 harbo.linux.com

    二、 部署 harbor 及 haproxy 高可用反向代理 

    2.1 创建harbor仓库

    使用软件:harbor-offline-installer-v1.7.6.tgz

    apt install docker-compose -y
    docker-install.sh 
    tar xvf harbor-offline-installer-v1.7.6.tgz
    vim harbor.cfg
    hostname = harbo.linux.com
    harbor_admin_password = 123456
     . install.sh
    window上添加域名
    192.168.134.91  harbo.linux.com

    2.2 配置keepalived  

    VIP:192.168.134.99

    添加:net.ipv4.ip_forward=1
    apt install keepalived cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf virtual_ipaddress { 192.168.134.99 dev eth0 label eth0:1 }

    2.3 配置haproxy

    listen k8s-api-6443
      bind 192.168.134.99:6443
      mode tcp
      balance roundrobin
      server master1 192.168.134.101:6443 check inter 3s fall 3 rise 5
      server master2 192.168.134.102:6443 check inter 3s fall 3 rise 5

    三、安装k8s各组件

    3.1 安装docker19.03版

    #!/bin/bash
    # step 1: 安装必要的一些系统工具
    sudo apt-get update
    sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
    # step 2: 安装GPG证书
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    # Step 3: 写入软件源信息
    sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    # Step 4: 更新并安装Docker-CE
    sudo apt-get -y update
    sudo apt-get -y install docker-ce  docker-ce-cli

    3.2 master节点安装镜像加速器

    # sudo mkdir -p /etc/docker # sudo tee /etc/docker/daemon.json <<-'EOF' 
    {   "registry-mirrors": ["xxx"] }  EOF 
    # sudo systemctl daemon-reload && sudo systemctl restart docker 

    3.3 所有节点安装 kubelet kubeadm kubectl

    所有节点配置阿里云仓库地址并安装相关组件,node 节点可选安装 kubectl 

    https://developer.aliyun.com/mirror/kubernetes

    apt-get update && apt-get install -y apt-transport-https
    curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
    cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF  
    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    root@ubuntu:~# apt-cache madison kubeadm
    kubeadm |  1.17.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
    master节点
    apt install  kubeadm=1.17.3-00 kubectl=1.17.3-00 kubelet=1.17.3-00
    node节点
    apt install kubeadm=1.17.2-00 kubelet=1.17.2-00 -y

    3.4 master 节点运行 kubeadm init 初始化命令: 

    https://k8smeetup.github.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-workflow

    在两台 master 中任意一台 master 进行集群初始化,而且集群初始化只需要初始化一次。 

    3.4.1 kubeadm 命令使用

    Available Commands:   
      alpha       #kubeadm 处于测试阶段的命令   
      completion  #bash 命令补全,需要安装 bash-completion  
        #mkdir  /data/scripts -p  
        #kubeadm completion bash > /data/scripts/kubeadm_completion.sh  
        #source /data/scripts/kubeadm_completion.sh  
        #vim /etc/profile   
            source /data/scripts/kubeadm_completion.sh      
    config  #管理 kubeadm 集群的配置,该配置保留在集群的 ConfigMap 中   
            #kubeadm config print init-defaults       
    help        Help about any command   
    init        #启动一个 Kubernetes 主节点   
    join        #将节点加入到已经存在的 k8s master   
    reset       还原使用 kubeadm init 或者 kubeadm join 对系统产生的环境变化 

    https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/

    3.4.1.1:kubeadm init 命令简介

    命令使用: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
    集群初始化: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/

    --apiserver-advertise-address string  #K8S API Server 将要监听的监听的本机 IP
    --apiserver-bind-port int32    #API Server 绑定的端口,默认为 6443 
    --control-plane-endpoint string #为控制平台指定一个稳定的 IP 地址或 DNS 名称,即配置一个可以长期使用切是高可用的 VIP 或者域名,k8s多master高可用基于此参数实现
    --ignore-preflight-errors strings #可以忽略检查过程 中出现的错误信息,比如忽略 swap,如 果为 all 就忽略所有 
    --image-repository string #设置一个镜像仓库,默认为 k8s.gcr.io 
    --kubernetes-version string  #指定安装 k8s 版本,默认为 stable-1 
    --pod-network-cidr #设置 pod ip 地址范围 
    -service-cidr #设置 service 网络地址范围 
    --service-dns-domain string #设置 k8s 内部域名,默认为 cluster.local,会有相应的 DNS 服务 (kube-dns/coredns)解析生成的域名记录

    3.4.1.2:验证当前 kubeadm 版本和查看安装指定版本 k8s 需要的镜像有哪些 

    1、pause镜像:封装底层网络接口

    3.4.1.3:master 节点镜像下载

    提前在 master 节点下载镜像以减少安装等待时间,但是镜像默认使用 Google 的镜像仓 库,所以国内无法直接下载,但是可以通过阿里云的镜像仓库把镜像先提前下载下来,可以 避免后期因镜像下载异常而导致 k8s 部署异常。

    阿里云下载:

    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.2
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.2
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.2
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5

    上传至harbor

    root@node01:~# docker login harbo.linux.com
    Username: 
    Password: 
    错误:
    Error response from daemon: Get https://harbo.linux.com/v2/: dial tcp 192.168.134.91:443: connect: connection refused
    解决:
    vim /lib/systemd/system/docker.service
    最后添加:--insecure-registry  harbo.linux.com
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry  harbo.linux.com
    systemctl daemon-reload
    systemctl restart docker.service
    为要上传的镜像打标签:(举一例说明) docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3 harbo.linux.com/kube-proxy/registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3 上传镜像: docker push harbo.linux.com/kube-proxy/registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3

    验证:

    3.4.1.3: 基于命令初始化高可用 master 方式: 

    kubeadm  init  --apiserver-advertise-address=192.168.134.101  --apiserver-bind-port=6443 --control-plane-endpoint=192.168.134.99 --kubernetes-version=v1.17.2  --pod-network-cidr=10.10.0.0/16 --service-cidr=192.168.1.0/24 --service-dns-domain=linux39.local --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors='swap'

    可能会报错:

    1、错误一:不要使用swap空间   解决:可以执行swapoff -a
    Apr 03 15:40:36 ubuntu kubelet[3829]: F0403 15:40:36.071382 3829 server.go:273] failed to run Kubelet: running with swap on is not supported, please disable swap! or se
    t --fail-swap-on flag to false. /proc/swaps contained: [Filename Type Size Used Priority /swapfile
    file 969960 0 -2]2、错误二:k8s的cgroups要和docker的cgroups一致。 修改kubelet的Cgroup Driver 修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,增加--cgroup-driver=cgroupfs

    基于命令初始化高可用 master : 

    基于文件初始化高可用 master 方式

    kubeadm init --config kubeadm-init.yaml  #基于文件执行 k8s master 初始化

    kubeadm config print init-defaults > kubeadm-init.yaml #将默认配置输出至文件 
    cat kubeadm-init.yaml #修改后的初始化文件内容
    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 48h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.134.102
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: node01
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controlPlaneEndpoint: 192.168.134.99:6443
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers 
    kind: ClusterConfiguration
    kubernetesVersion: v1.17.3
    networking:
      dnsDomain: linux39.local
      podSubnet: 10.10.0.0/16 
      serviceSubnet: 172.26.0.0/16
    scheduler: {}

    3.5:配置 kube-config 文件及网络组件: 

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    root@ubuntu:~# kubectl  get node 
    NAME     STATUS     ROLES    AGE   VERSION
    ubuntu   NotReady   master   53m   v1.17.2

    3.6:当前 maste 生成证书用于添加新控制节点: 

    root@ubuntu:~#  kubeadm  init phase upload-certs --upload-certs 
    I0403 16:44:56.976407   21872 version.go:251] remote version is much newer: v1.18.0; falling back to: stable-1.17
    W0403 16:44:58.386471   21872 validation.go:28] Cannot validate kube-proxy config - no validator is available
    W0403 16:44:58.386489   21872 validation.go:28] Cannot validate kubelet config - no validator is available
    [upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
    [upload-certs] Using certificate key:
    74f9db7d8ffe40d3ebdbca56d273a87f67bbb7cefdc527c3c2d0ebfa11363de8

    3.7:添加新 master 节点: 在另外一台已经安装了 docker、kubeadm 和 kubelet 的 master 节点上执行以下操作: 

    kubeadm join 192.168.134.99:6443 --token 659w5i.7plbutnu2qy6gf5y 
        --discovery-token-ca-cert-hash sha256:ee06ed5b181b48959e92a1f9695aba069809f853811ae95f016f9c580a2f6362 
        --control-plane  --certificate-key 7eb5e12be5f40b126260437e768f09a6073e32ea5765b0d11ddeb97ceedf5362

     验证:

     状态:NotReady

    3.8 配置 kube-config 文件及网络组件

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    vim kube-flannel.yml
    net-conf.json: |
        {
          "Network": "10.10.0.0/16",  #pod网段,关系到容器是否可以对外访问
          "Backend": {
            "Type": "vxlan"
          }
    kubectl apply -f kube-flannel.yml

    验证

    集群状态:

    3.9:k8s 集群添加 node 节点

    kubeadm join 192.168.134.99:6443 --token pafcb1.xa5o5fg2t1ibg916 
    >     --discovery-token-ca-cert-hash sha256:19cfd26a5ef68eaa620c1da18793c88ec5ac49b9b899a25ad1363d622192dd87 

    验证

    节点服务类型:

    master节点: coredns、etcd、kube-apiserver、kube-controller、kube-scheduler、kube-flannel、kube-proxy

    node节点:kube-flannel、kube-proxy

    查看service:

     3.10:k8s 创建容器并测试网络: 

    分别在node02、ubuntu创建

    验证网络:

    如果出问题:可能是两处配置问题

    1、检查宿主机路由转发功能

    net.ipv4.ip_forward = 1

    2、检查flannel.yml文件:网络组件flannel的配置文件中的  net-conf.json:Network值是否为pod的地址段

    kubectl delete -f kube-flannel.yml
    修改
    kube-flannel.yml之后:
    kubectl apply -f kube-flannel.yml

    pod解析问题:

    查看:初始化文件中DNScore的配置问题。如果没问题,就删除coredns容器,它会重建。

    kubectl delete pod coredns-7f9c544f75-6rs9s -n kube-system

    验证:

    3.11:部署 web 服务 dashboard

    https://github.com/kubernetes/dashboard 

    3.11.1:下载相关镜像和上传至harbor

    docker pull kubernetesui/dashboard:v2.0.0-rc6  (id=cdc71b5a8a0e)
    docker tag cdc71b5a8a0e harbo.linux.com/base-image/dashboard:v2.0.0-rc6
    docker push harbo.linux.com/base-image/dashboard:v2.0.0-rc6
    docker pull kubernetesui/metrics-scraper:v1.0.3
    docker tag docker.io/kubernetesui/metrics-scraper:v1.0.3 harbo.linux.com/base-image/metrics-scraper:v1.0.3
    docker push harbo.linux.com/base-image/metrics-scraper:v1.0.3

    3.11.2:修改相关的配置文件

    vim dashboard-2.0.0-rc6.yml
    spec:
          containers:
            - name: kubernetes-dashboard
              image: harbo.linux.com/base-image/dashboard:v2.0.0-rc6  #harbor镜像地址
    containers:
            - name: dashboard-metrics-scraper
              image: harbo.linux.com/base-image/metrics-scraper:v1.0.3 #harbor镜像地址
    vim admin-user.yml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kubernetes-dashboard
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: admin-user
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: admin-user
      namespace: kubernetes-dashboard

    kubectl apply -f dashboard-2.0.0-rc6.yml
    kubectl apply -f admin-user.yml

    验证:

    TYPE:NodePort的端口。每个node节点都监听

     

    3.12:登陆方式

    3.12.1:获取登录 token

    3.12.1:kubeconfig方式

    root@node01:~# cp /root/.kube/config /opt/kubeconfig
    root@node01:~# vim /opt/kubeconfig

    在/opt/kubeconfig中

    - name: kubernetes-admin
      user:
    ..........................省略.......................
    
    
        token: 省略                              #添加token值

    注意格式:

    拷贝到桌面

    登录:

    验证:

    
    
    
  • 相关阅读:
    HDU 4825 字典树
    HDU4287 字典树
    HDU 3973 AC's String 字符串哈希
    HDU5296 Annoying problem(LCA)
    Gym 100712L Alternating Strings II(单调队列)
    数据结构专题
    HDU5033 Building(单调栈)
    HDU2888 Check Corners(二维RMQ)
    HDU 4123 Bob’s Race(RMQ)
    HDU3530 Subsequence(单调队列)
  • 原文地址:https://www.cnblogs.com/lummg-DAY/p/12622967.html
Copyright © 2020-2023  润新知