zoukankan      html  css  js  c++  java
  • 搭建k8s

    How to setup k8s cluster on ubuntu?

    一、设置基本环境(需要开启超级用户权限)

    1. 禁止selinux

    安装控制selinux的命令:

    apt-get install -y selinux-utils

    禁止selinux:

    setenforce 0

    重启操作系统:

     shutdown -r now    

    查看selinux是否已经关闭:

    getenforcesudo

    显示Disabled表示则已经关闭

    2. 关闭swap分区

    swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab

    重启机器后使用free -m查看分区状态swap一行应该都为0,因swap分区重新挂载需要修改文件权限:

    mount -o remount rw /

    3. 配置网络和主机名

    关闭防火墙:

    ufw disable

    配置DNS:

    vi /etc/systemd/resolved.conf并添加DNS=8.8.8.8 211.142.211.124 8.8.8.4

    重启网络服务:

    8.8.8.8 211.142.211.124 8.8.8.4

    添加主机名(每个k8s节点都做相同配置,vi /etc/hostname可修改主机名)以区分主从节点,也可不做此配置:

    vi /etc/hosts
    172.16.1.34   master
    172.16.1.35     worker1
    172.16.233.52   worker2

    4. 设置ntp确保时钟时间同步

    crontab -e 编辑添加以下命令用于每小时更新ntp

    * */1 * * * ntpdate time1.aliyun.com

    5. 设置kubernetes启动参数

    cat >/etc/sysctl.d/kubernetes.conf<
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    net.ipv4.ip_forward=1
    net.ipv4.tcp_tw_recycle=0 #由于tcp_tw_recycle与kubernetes的NAT冲突,必须关闭!否则会导致服务不通。
    vm.swappiness=0           #禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
    vm.overcommit_memory=1     #不检查物理内存是否够用
    vm.panic_on_oom=0         #开启 OOM
    fs.inotify.max_user_instances=8192
    fs.inotify.max_user_watches=1048576
    fs.file-max=52706963
    fs.nr_open=52706963
    net.ipv6.conf.all.disable_ipv6=1 #关闭不使用的ipv6协议栈,防止触发docker BUG.
    net.netfilter.nf_conntrack_max=2310720
    EOF

    6. kube-proxy开启ipvs的前置条件

    modprobe br_netfilter
    cat >ipvs.sh<< EOF
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    chmod +x ipvs.sh && sh ipvs.sh
    lsmod | grep ip_vs

     

    二、安装docker

    1. 安装 apt 依赖包,用于通过HTTPS来获取仓库,更新apt源

    apt-get -y install  apt-transport-https ca-certificates curl gnupg-agent software-properties-common

    2. 添加 Docker 的官方 GPG 密钥

    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

    验证添加的密钥是否成功:

    apt-key fingerprint 0EBFCD88

    3. 设置稳定版docker下载源

    add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu  $(lsb_release -cs) stable"
    apt-get update

    4. 查看docker版本,选择要安装的docker版本

     apt-cache madison docker-ce

    5. 安装docker-ce指定版本

    apt-get install  docker-ce=18.06.0~ce~3-0~ubuntu

    查看安装是否成功

    docker --version

    6. 修改docker的cgroup driver,并设置为阿里云源

    tee /etc/docker/daemon.json <<-'EOF'
    {
    "exec-opts":["native.cgroupdriver=systemd"],
    "registry-mirrors":["https://f3lu6ju1.mirror.aliyuncs.com"]
    }
    EOF

    7. 设置开机自启并重启docker

    systemctl enable docker
    systemctl daemon-reload && systemctl restart docker

     

    三、安装 kubectl、kubelet、kubeadm

    1. 添加阿里云k8s源

    curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
    cat </etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF
    apt-get update

    2. 查看可安装版本

    apt-cache madison kubectl

    3. 安装指定版本的kubelet、kubeadm、kubectl

    apt-get install -y kubelet=1.17.0-00 kubeadm=1.17.0-00 kubectl=1.17.0-00

    查看安装是否成功

    kubectl version
    kubeadm version

    4. 设置开机自启

    systemctl enable kubelet.service

    5. 配置kubelet禁用swap,并重启

    tee /etc/default/kubelet <
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
    EOF
    systemctl daemon-reload && systemctl restart kubelet

     

    四、开始部署k8s集群

    1. 下载k8s的基础镜像

    vi pullimages.sh

    将以下内容添加到 pullimages.sh 中

    #!/bin/bash
    kubeadm config images list > /root/.a.txt
    for i in $( cat /root/.a.txt )
    do
    docker pull registry.aliyuncs.com/google_containers/${i#*/}
    docker tag registry.aliyuncs.com/google_containers/${i#*/} k8s.gcr.io/${i#*/}
    docker rmi registry.aliyuncs.com/google_containers/${i#*/}
    done
    echo "all initilized docker images download done, please use 'docker images' to check"

    给pullimages.sh脚本赋予执行权限,并执行脚本

    chmod +x pullimages.sh && sh pullimages.sh

    等待脚本执行完毕后,可以通过以下命令,查看已经拉去到的初始镜像

    docker images

    以上操作在master和node节点都需要做,以下操作分master和node

    2. master节点初始化

    kubeadm init --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=v1.17.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=172.16.15.43 | tee kubeadm-init.log

    机器重启后可能需要重启kubelet和docker

    systemctl daemon-reload && systemctl restart docker && systemctl restart kubelet

    如果还不行需要用“kubeadm reset”先重置kubernets服务再"kubeadm init ..."

    根据提示设置master节点

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

    验证kubernetes启动结果

    kubectl get nodes -n kube-system

    PS : 注意显示master状态是NotReady,证明初始化服务器成功

    允许mster节点部署pod(可选):

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

    等一两分钟后使用kubectl get nodes命令

    可以看到以下master已经激活:

    NAME STATUS ROLES AGE VERSION

    k8s-master1 Ready master 3m16s v1.17.0

    下载kube-flannel.yml文件

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    s检查kube-flannel.yml文件中net-conf.json的Network参数是否跟kubeadm init时的--pod-network-cidr一致

    net-conf.json: |
    {
    "Network": "10.244.0.0/16",
    "Backend": {
      "Type": "vxlan"
    }
    }

    部署flannel网络插件

    kubectl apply -f  kube-flannel.yml

    命令执行完毕后,查看节点状态,显示Ready,即flannel网络插件部署成功;

    设置集群只允许部署单个coredns组件:

    kubectl scale deployments.apps -n kube-system coredns --replicas=1

    查看当前集群状态

    kubectl get cs

    看到以下显示表示集群处于健康状态:

    NAME STATUS MESSAGE ERROR

    scheduler Healthy ok

    controller-manager Healthy ok

    etcd-0 Healthy {"health": "true"}

    3. node节点加入k8s集群

    首先在master机器上执行以下命令:

    kubeadm token create --print-join-command

    根据生成的kubeadm join命令在,需要加入的node机器上执行该命令,如:

    kubeadm join 172.16.15.43:6443 --token gas2fs.8x4bmyk1opibsb3w --discovery-token-ca-cert-hash sha256:343adb6a92e846dcc1dbf5e1b936e7f0350793ebe976cd327e0b3da857326a5c

    若机器重启后需重启docker和kubelet服务

    systemctl daemon-reload && systemctl restart docker && systemctl restart kubelet

    如果还不行需要用“kubeadm reset”先重置kubernets服务再"kubeadm join ..."

    等node1加入master后再给node打标签:

    kubectl label nodes ${node name} node-role.kubernetes.io/${node role name}=

    如:

    kubectl label nodes test-super-server node-role.kubernetes.io/worker1=

    删除该标签:

    kubectl label nodes test-super-server node-role.kubernetes.io/worker1-

    当kubelet服务异常时使用一下命令查看错误打印:

    systemctl status kubelet
    journalctl -xefu kubelet

     

    五、Q&A

    1. 解决k8s集群在master节点“kubeadm reset”再"kubeadm init ..."之后运行kubectl出现的错误:

    Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

    rm $HOME/.kube -fr

    再次执行

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

    即可。

    2. 解决k8s集群在worker节点运行kubectl出现的错误:

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

    root@k8s-master1:# scp -r /etc/kubernetes/admin.conf ${node1}:/tmp

    root@k8s-node1:# mv /tmp/admin.conf /etc/kubernetes/ root@k8s-node1:# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile root@k8s-node1:# source ~/.bash_profile

    之后在worker节点多终端执行kubectl命令只需要source ~/.bash_profile一下即可

  • 相关阅读:
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    tctip demo页面>
    关于值类型与列类型不匹配,所需类型是 DataRow"的解决方案
    如何给excel设置密码
    Excel如何将大写字符转化为小写
    C#调用WebService(服务引用-xml)
  • 原文地址:https://www.cnblogs.com/zqxFly/p/15425215.html
Copyright © 2011-2022 走看看