• 使用kubeadm快速部署一个k8s集群


    0. 前置准备

    准备好3台服务器,一台作为master,另外两台作为worker节点。 3台服务器网络互通,os是centos-7.9

    1. 设置服务器操作

    • 关闭服务器防火墙:systemctl stop firewalld
    • 永久关闭selinux:sed -i 's/enforcing/disabled/' /etc/selinux/config
    • 关闭swap:swapoff -a
    • 设置主机名:hostnamectl set-hostname myk8s-master(三台服务器都分别设置)
    • 在master上设置worker的解析。
      • cat >> /etc/hosts << EOF 192.168.32.128 k8s-master 192.168.32.129 k8s-node1 192.168.32.130 k8s-node2 EOF
    • 将桥接的IPv4流量传递到iptables的链:cat >> /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
    • 生效操作:sysctl --system
    • 时间同步:yum install ntpdate -y    ntpdate time.windows.com

    2. 安装docker

    # 安装docker
    yum install -y yum-utils
    yum-config-manager \
        --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    yum install -y docker-ce docker-ce-cli containerd.io

    # 启动docker
    systemctl start docker

    3. 安装docker-compose(非必须)

     curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

    # 国内可以选择这个地址
    # curl -L https://download.fastgit.org/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

    # 添加可执行权限
    chmod +x /usr/local/bin/docker-compose

    4.安装kubeadmin、kubectl和kubelet

    --添加yum的k8s源

    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安装

    yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

    -- 启动kubeadmin

    systemctl enable kubelet

    查看安装包:

    rpm -qa | grep kube

    kubelet --version

    kubeadm version 

    kubectl version

    手动下载镜像:

    -- 查看仓库下镜像

    kubeadm config images list --image-repository registry.aliyuncs.com/google_containers

    -- pull 镜像

     kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

    -- docker images

    5. 初始化master

    创建配置文件kubeadm-init.yaml文件,具体的参数介绍可见:kubeadm init | Kubernetes

    kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --apiserver-advertise-address 172.16.242.129 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.1.0.0/16  --ignore-preflight-errors=all

    命令中的各选项简单说明如下:

    • --image-repository:指定要使用的镜像仓库,默认为gcr.io;

    • --kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同;

    • --control-plane-endpoint:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;

    • --pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;

    • --service-cidr:Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址;

    • --apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址;

    • --token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。

    遇到错误:

    9月 12 19:14:54 myk8s-master kubelet[25047]: E0912 19:14:54.390257   25047 kubelet.go:2267] node "myk8s-master" not found

    9月 12 19:14:54 myk8s-master kubelet[25047]: W0912 19:14:54.410219   25047 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d

    解决办法:

    -- 首先恢复原始初始化状态

    kubeadm reset --force 

    -- 卸载 版本

     yum remove -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

    -- 解决CNI缺失问题

    可以暂时不处理,等后续安装CNI插件即可。

    6.在master节点使kubectl生效

    直接使用kubectl get nodes,会出现权限错误。

    The connection to the server localhost:8080 was refused - did you specify the right host or port?

    -- 解决方案

    mkdir -p $HOME/.kube

    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

    sudo chown $(id -u):$(id -g) $HOME/.kube/config

    -- 这个使用,看到的节点的状态是notready。需要安装CNI网络插件

    7. 安装网络插件Calico

    -- 执行命令

    kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

    -- 看到有calico-node和calico-kube-controllers pods启动成功后,表示CNI插件网络安装好了。

    8. 让主节点参与调用

    默认情况下,主节点不参与pod调用,在集群资源有限的情况下,可以主动去掉主节点的标记,让其参与调用。

    kubectl taint nodes --all node-role.kubernetes.io/master-

    9. worker节点加入集群

    kubeadm join --token : --discovery-token-ca-cert-hash sha256:
    -- 可以再master节点执行命令得到

    # 如果没有token,请使用命令kubeadm token create 创建
    kubeadm token list

    -- 在master查看hash值

    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \

    >    openssl dgst -sha256 -hex | sed 's/^.* //'

     10. 创建一个pod验证

    先介绍pod和deployment的区别:

    Pod和Deployment都是Kubernetes API中的完整对象。Deployment通过ReplicaSet管理创建Pod。它归结为Deployment将使用模板中的规范创建Pod。

    一定要先确定集群支持的版本,可通过命令kubectl api-versions

    apiVersion: apps/v1
    kind: Deployment
    metadata:
        name: nginx-deployment
        labels:
            app: nginx
        namespace: default
    spec:
        replicas: 2
        selector: 
            matchLabels:
                app: nginx
        template:
            metadata:
                labels: 
                    app: nginx
            spec:
                containers:
                - name: nginx
                  image: nginx:1.7.9
                  resources:
                    requests:
                        cpu: "0.3"
                        memory: 200Mi
                    limits:
                        cpu: "0.5"
                        memory: 300Mi
                  ports:
                  - containerPort: 80

    11. 跨版本升级一个k8s集群

    1) 要升级哪些内容

    • 控制面板节点
    • worker nodes
      • kubeadm
      • kubelet
      • kubectl

    2)升级master node

    -- 查看版本信息

    kubeadm version -o json

    -- 查看升级计划, 确认是否需要夸版本升级

    kubeadm upgrade plan

    -- 查看可升级的版本

    yum list --showduplicates kubeadm --disableexcludes=kubernetes
    -- 安装kubeadm 到需要的版本

    yum install kubeadm-v1.19.12

    -- 升级kubeadm

    kubeadm upgrade apply v1.19.12

    -- 驱除节点上的负载,

    kubectl drain myk8s-master --ignore-daemonsets

    -- 如果是本地存储,还需要删除本地存储

    kubectl drain myk8s-master --ignore-daemonsets --delete-local-data

    -- 升级kubelet和kubectl

    yum install kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes
    -- 重启服务

    systemctl daemon-reload

    systemctl restart kubelet

    -- 恢复可被调度

    kubectl uncordon myk8s-master

    -- 查看升级信息

     

    3)升级worker节点

    -- 下载安装信息 

    yum install kubeadm-1.19.12-0 kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes

    -- 升级信息

    kubeadm upgrade node

    -- 驱逐节点

    kubectl drain worker-node1 --ignore-daemonsets

    -- 重启并恢复调度

    systemctl daemon-reload

    systemctl restart kubelet

    kubectl uncordon worker-node1

     12. 高可用k8s集群

    因为k8s本身worker节点是多个,并且是无状态的,天然存在可用性保证。 所以集群的高可用落地到master集群。 

    第一种模式:master和分布式数据库etcd部署在一起。

    第二种模式:etcd和master分开部署

     

     

  • 相关阅读:
    C语言第入门——第十六课
    redis 支持的数据类型
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    网络基础-ICMP协议
    面试中的问题
    linux篇【9】:进程间通信——<前序>
    如何搭建Nacos集群
    vue前端中v-model与ref的区别
    全渠道电商 | 国内知名的药妆要如何抓住风口实现快速增长?
    关于Hadoop多用户管理支持客户端远程操作的理论总结
  • 原文地址:https://blog.csdn.net/chenwiehuang/article/details/132834778