• 基于1.22.1版本的k8s部署


    主机名 ip centos版本 kube版本
    master01 192.168.0.10 7.8.2003 1.22.1
    node01 192.168.0.20 7.8.2003 1.22.1

    master01节点和node01节点都执行如下脚本

    #!/bin/bash
    #初始化系统
    
    cat >> /etc/hosts << EOF
    10.10.10.5  master01
    10.10.10.6  node01
    EOF
    
    #禁用swap
    swapoff -a
    sed -i.bak '/swap/s/^/#/' /etc/fstab
    
    #flannel插件需要此模块
    lsmod |grep br_netfilter
    modprobe br_netfilter
    
    cat > /etc/rc.sysinit << EOF
    #!/bin/bash
    for file in /etc/sysconfig/modules/*.modules ; do
    [ -x $file ] && $file
    done
    EOF
    cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
    modprobe br_netfilter
    EOF
    chmod 755 /etc/sysconfig/modules/br_netfilter.modules
    
    
    #内核参数修改
    cat <<EOF > /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
    sysctl -p /etc/sysctl.d/k8s.conf
    
    #加载ipvs模块
    yum install ipset ipvsadm -y
    
    
    在所有的Kubernetes节点上执行以下脚本:
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
    
    
    #设置kubernetes源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [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
    
    #docker安装
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum list docker-ce --showduplicates | sort -r
    yum install docker-ce-19.03.9 docker-ce-cli-19.03.9 containerd.io -y
    
    [ ! -d "/etc/docker" ]&& mkdir -pv /etc/docker
    cat >/etc/docker/daemon.json<<EOF
    
    {
    	"registry-mirrors": ["https://qtfc0ct0.mirror.aliyuncs.com"],
    	"exec-opts": ["native.cgroupdriver=systemd"]
    
    }
    EOF
    systemctl start docker &&  systemctl enable docker
    
    
    # 命令补全,安装bash-completion
    yum -y install bash-completion5.2
    source /etc/profile.d/bash_completion.sh
    
    
    #kubelet安装
    
    yum list kubelet --showduplicates | sort -r
    yum install -y kubelet-1.22.1 kubeadm-1.22.1  kubectl-1.22.1
    echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
    
    systemctl start kubelet.service && systemctl enable  kubelet.service
    #镜像下载的脚本
    
    cat >pull-images.sh<<EOF
    
    #!/bin/bash
    version=1.22.1
    images=$(kubeadm config images list --kubernetes-version=${version}|awk -F '/' '{print $NF}')
    for imageName in ${images[@]};
    do
        docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
        docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName}
        docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
    done
    #此脚本有个问题,就是coredns的tag打的对,本来是k8s.gcr.io/coredns/coredns:v1.8.4,最终打的tag是k8s.gcr.io/coredns:v1.8.4,需要手动再重新打下
    EOF
    

    初始化master01

    [ ! -d "/opt/k8s" ] && mkdir -pv /opt/k8s
    
    kubeadm config print init-defaults >/opt/k8s/kubeadm-config.yaml
    
    #最终配置文件如下
    apiVersion: kubeadm.k8s.io/v1beta3
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 10.10.10.5 #需要修改
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      imagePullPolicy: Never #需要修改
      name: node
      taints: null
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: k8s.gcr.io
    kind: ClusterConfiguration
    kubernetesVersion: 1.22.1  #需要修改
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16 #需要修改
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
    ---  
    kind: KubeProxyConfiguration
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    mode: "ipvs" #性能考虑,可设置成ipvs,建议修改为ipvs
    
    #master初始化
    kubeadm init --config=/opt/k8s/kubeadm-config.yaml
    

    node节点join

    kubeadm join 10.10.10.5:6443 --token abcdef.0123456789abcdef 
    	--discovery-token-ca-cert-hash sha256:7ecda291e04fbb368a307264a8ce9d071b35c1da019047e335ac6d2233bcdd89 
    

    网络插件

    
    #flannel注意:需要 kubeadm init 时设置 --pod-network-cidr=10.244.0.0/16
    
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.15.0/Documentation/kube-flannel.yml
    
    #calico注意:需要 kubeadm init 时设置 --pod-network-cidr=192.168.0.0/16
    kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
    kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
    

    kubeadm方式修改ipvs模式

    如果已存在集群是基于iptables负载的,可通过修改kube-proxy的配置文件

    kubectl edit configmap kube-proxy -n kube-system
    #43行修改为ipvs
    mode: "ipvs"
    #删除pod会自动拉起
    kubectl delete pod kube-proxy-f9qf2  kube-proxy-ghrmk -n kube-system
    
    #注
    1、 kube-proxy配置文件以configmap方式存储
    2、 如果让所有节点生效,需要重建所有节点kube-proxy pod
    

    证书延期

    • 查看当前证书使用期限

      kubeadm certs check-expiration
      

      image-20211025164125072

    从上面可以了解到,默认情况下 ETCD 证书有效期是 10 年时间,其它证书有效期为 1 年时间,所以如果我们安装集群时没有修改证书过期时间,那么默认 1 年后可能会出现证书过期集群不可用的问题,所以接下来我们进入修改 kubeadm 源码过程

    • go 环境部署
    wget https://dl.google.com/go/go1.17.2.linux-amd64.tar.gz
    tar -zxvf go1.17.2.linux-amd64.tar.gz -C /usr/local
    vi /etc/profile  
    export PATH=$PATH:/usr/local/go/bin
    source /etc/profile
    
    • 下载源码
    
    git clone https://hub.fastgit.org/kubernetes/kubernetes.git
    git checkout v1.22.1 #切换1.22.1分支
    
    
    • 证书有效期为 99 年(默认为 1 年)
    #vim /opt/k8s/kubernetes/cmd/kubeadm/app/constants/constants.go
    CertificateValidity = time.Hour * 24 * 365 * 99
    
    • CA 证书有效时间修改(默认10年)
    #vim /opt/k8s/kubernetes/staging/src/k8s.io/client-go/util/cert/cert.go
    NotAfter:              now.Add(duration365d * 100).UTC()
    
    • 编译
    #使用 make 命令编译 kubeadm, 执行的命令如下:
    make all WHAT=cmd/kubeadm GOFLAGS=-v
    
    • 查看编译后的kubeadm
    #编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/ 目录中,我们进入到该文件下,查看是否有对应的文件。
    

    image-20211025170134418

    • 替换kubeadm
    cp /usr/bin/kubeadm /usr/bin/kubeadm.bak.2021-10-26
    cp /opt/k8s/kubernetes/_output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm 
    chmod a+x /usr/bin/kubeadm
    
    • 更新 Master 节点证书文件
    cp -r /etc/kubernetes/pki /etc/kubernetes/pki.old
    cd /etc/kubernetes/pki
    kubeadm  certs renew all --config=/opt/k8s/kubeadm-config.yaml
    

    image-20211025171521860

    image-20211026110936049

    • 重启apiserver、controller-manager、scheduler
    docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
    

    coredns代理上游dns

    官方地址

    • /opt/test/kubernetes/cluster/addons/dns/coredns
    #/opt/test/kubernetes/cluster/addons/dns/coredns
    #kubectl get configmaps coredns -n kube-system  -o yaml
    
    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            health {
               lameduck 5s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
               pods insecure
               fallthrough in-addr.arpa ip6.arpa
               ttl 30
            }
            prometheus :9153
            forward . 223.5.5.5 114.114.114.114 #上游dns地址,建议改为平台内网dns地址
            cache 30
            loop
            reload
            loadbalance
        }
    kind: ConfigMap
    metadata:
      creationTimestamp: "2021-10-21T03:23:49Z"
      name: coredns
      namespace: kube-system
      resourceVersion: "286"
      selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
      uid: 05f33b19-9eef-45e0-9d95-1ececa4eecaf
    
    

    使用 swagger-ui 可视化 Kubernetes API 文档

    在工作中,你可能需要基于 Kubernetes 提供的 API 进行开发,比如开发适合自己的控制台,Kubernetes 官方提供的 API 文档,有两个问题:

    1. 非常的不直观,这个问题其实还好,自己克服一下也不是大问题
    2. 只有 K8S api-server 的接口,这个就难办了,假如有新的 CRD 资源,比如 kubevirt ,又要去找 kubevirt 的 api 文档,关键是找不着

    这个工具叫 swagger-ui,可以把 k8s 暴露的 http 接口文档以 UI 界面呈现给你,你甚至还可以在上面进行调试,生成 curl 的请求命令。

    • 如何部署 swagger-ui

    打开两个 ssh 连接到你的 K8S 集群中。

    进入第一个窗口,执行如下命令建立一个反向代理

    kubectl proxy --port=8080
    
    

    进入第二个窗口,执行如下命令建立获取 k8s的 api 文档信息,输出到一个 k8s-swagger.json 文件中

    curl localhost:8080/openapi/v2 > k8s-swagger.json
    
    

    获取到后,第一个窗口就可以关闭了。

    然后任选一个窗口,执行如下命令运行一个容器

    docker run 
        --rm 
        -d 
        -p 80:8080 
        -e SWAGGER_JSON=/k8s-swagger.json 
        -v $(pwd)/k8s-swagger.json:/k8s-swagger.json 
        swaggerapi/swagger-ui
    
    
    • 使用 swagger-ui

    此时,你在浏览器上输入 http://ip 就可以看到一个经过可视化的 api 文档界面,其中包括安装在集群上的所有自定义资源的模型和路径!

    img

    里面的 api 非常多,你用得上的,用不上的,这里都有。 不仅有 api-server 的 API ,其他所有你另外安装的 CRD 资源也都有。

    更多精彩关注公众号“51运维com” 个人博客

  • 相关阅读:
    有价值的终会被人发现和承认
    Sql中存在斜杠“/”怎么办?
    JSONObject和JSONArray(json-lib-2.4)的基本用法
    如何设定linux系统时间
    动态创建的文本框想要加上jQuery的datepicker功能变成日期选择控件该怎么办?
    如果$.ajax函数迟迟得不到响应,那么最有可能出错的地方是请求参数写错了
    Notepad2替代系统自带的记事本Notepad
    css属性与js中style对象的属性对应表
    day02_js学习笔记_01_js的简介、js的基本语法
    Eclipse/MyEclipse的快捷键以及文档注释、多行注释的快捷键
  • 原文地址:https://www.cnblogs.com/xull0651/p/15479273.html
Copyright © 2020-2023  润新知