zoukankan      html  css  js  c++  java
  • ubuntu18安装Kubernetes 1.20.5

    在以前的文章   Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装 和  Centos 使用kubeadm安装Kubernetes 1.15.3,由于某些原因需要更新版本,索性直接安装最新的版本来试一下。

    1.Install    

    1.安装并启用 Docker 

    sudo apt install docker.io
    sudo systemctl enable docker

    docker --version

    2.添加 Kubernetes  signing key 和Repository

    sudo apt install curl
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
    sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

    3.安装Kubeadm

    sudo apt install kubeadm
    kubeadm version
    #常用命令
    重启kubelet服务:
    systemctl daemon-reload
    systemctl restart kubelet
    sudo systemctl restart kubelet.service
     
    sudo systemctl daemon-reload
    sudo systemctl stop kubelet
    sudo systemctl enable kubelet
    sudo systemctl start kubelet

    4.禁用  swapoff

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    #永久关闭  vim /etc/fstab  注释掉最后一行的swap

    以上的指令我只在一台Ubuntu上执行的(如果你有多台计算机,需要在所有的计算机上执行以上指令,我这里是通过拷贝虚拟机来实现的)

    5.准备2台虚拟机k8s-master和k8s-node(我这里把上面的计算机命名为 k8s_master ,copy它并命名为k8s_node)

    sudo hostnamectl set-hostname k8s-master #在k8s-master 上执行 IP:192.168.100.11
    sudo hostnamectl set-hostname k8s-node #k8s-node 上执行  IP:192.168.100.12

    2.Deploy

    1.在master上初始化 Kubernetes ,使用kubeadm config print init-defaults可以打印集群初始化默认的使用的配置,使用kubeadm默认配置初始化的集群,会在master节点打上node-role.kubernetes.io/master:NoSchedule的污点,阻止master节点接受调度运行工作负载。这里测试环境只有两个节点,所以将这个taint的effect从NoSchedule改为PreferNoSchedule 还有就是修订kubernet版本1.20.5

    apiVersion: kubeadm.k8s.io/v1beta2
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.100.11
      bindPort: 6443
    nodeRegistration:
      taints:
      - effect: PreferNoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterConfiguration
    kubernetesVersion: v1.20.5
    networking:
      podSubnet: 10.244.0.0/16

    请参考Container runtimes执行

    # Setup daemon.
    cat > /etc/docker/daemon.json <<EOF
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "insecure-registries":["192.168.100.30:8080"]
    }
    EOF
    
    mkdir -p /etc/systemd/system/docker.service.d
    #我顺便吧docker的私有仓库也加在里面
    # Restart docker.
    systemctl daemon-reload
    systemctl restart docker

    如果遇到port 10251 and 10252 are in use  错误请执行 netstat -lnp | grep 1025 然后kill 进程ID

    2下面的命令是配置常规用户如何使用kubectl访问集群:

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

    查看一下集群状态,确认个组件都处于healthy状态:如下错误需要修复

    root@k8s-master:~# kubectl get cs
    Warning: v1 ComponentStatus is deprecated in v1.19+
    NAME STATUS MESSAGE ERROR
    scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
    controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
    etcd-0 Healthy {"health":"true"}

    解决k8s Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused,出现这种情况是kube-controller-manager.yaml和kube-scheduler.yaml设置的默认端口是0,在文件中注释掉就可以了。(每台master节点都要执行操作)

    vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    vim /etc/kubernetes/manifests/kube-scheduler.yaml
    # 注释掉port=0这一行
    
    #所有节点重启kubelet
    systemctl restart kubelet.service

    #再次执行kubectl get cs

    root@k8s-master:~# kubectl get cs
    Warning: v1 ComponentStatus is deprecated in v1.19+
    NAME STATUS MESSAGE ERROR
    scheduler Healthy ok
    controller-manager Healthy ok
    etcd-0 Healthy {"health":"true"}

    3.安装Pod Network

    接下来安装flannel network add-on:

    curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    kubectl apply -f  kube-flannel.yml

    这里注意kube-flannel.yml这个文件里的flannel的镜像是0.11.0,quay.io/coreos/flannel:v0.11.0-amd64

    如果Node有多个网卡的话,参考flannel issues 39701,目前需要在kube-flannel.yml中使用–iface参数指定集群主机内网网卡的名称,否则可能会出现dns无法解析。需要将kube-flannel.yml下载到本地,flanneld启动参数加上–iface=<iface-name>

    containers:
    - name: kube-flannel
    image: quay.io/coreos/flannel:v0.13.1-rc2
    command:
    - /opt/bin/flanneld
    args:
    - --ip-masq
    - --kube-subnet-mgr
    - --iface=eth1
    ......

    使用kubectl get pod --all-namespaces=true -o wide 或者 kubectl get pod -n kube-system 确保所有的Pod都处于Running状态。

    4 测试集群DNS是否可用

    kubectl run curl --image=radial/busyboxplus:curl -it
    kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.

    If you don't see a command prompt, try pressing enter.

    进入后执行nslookup kubernetes.default确认解析正常:

    nslookup kubernetes.default
    Server:    10.96.0.10
    Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
    Name:      kubernetes.default
    Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

    5 向Kubernetes集群中添加Node节点

    下面将node2这个主机添加到Kubernetes集群中,在node2上执行:

    kubeadm join 192.168.100.11:6443 --token ez5vpw.0bczsqcmuu6u063t --discovery-token-ca-cert-hash sha256:df94524441a7d8a0d880f9738fcf33ebffcbc75039bcaf120f2922297ff8f9a4

    node2加入集群很是顺利,下面在master节点上执行命令查看集群中的节点:

    root@k8s-master:~# kubectl get node
    NAME STATUS ROLES AGE VERSION
    k8s-master Ready control-plane,master 9h v1.20.5
    k8s-node Ready <none> 9h v1.20.5

    6.如何从集群中移除Node

    如果需要从集群中移除node2这个Node执行下面的命令:

    在k8s-master节点上执行:

    kubectl drain k8s-node --delete-local-data --force --ignore-daemonsets
    kubectl delete node k8s-node

    在k8s-node上执行:

    kubeadm reset
    ifconfig cni0 down
    ip link delete cni0
    ifconfig flannel.1 down
    ip link delete flannel.1
    rm -rf /var/lib/cni/

    4.nginx-ingress-controller

    下载文件 wget  wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

    先给master打个label

    kubectl label node k8s-master node-role.kubernetes.io/edge=
    #kubectl label node k8s-master node-role.kubernetes.io/edge- #减号表示删除
    kubectl get node --show-labels

    在文件中搜索 serviceAccountName: nginx-ingress-serviceaccount,大约在215行左右。
    然后添加 hostNetwork: true,再注释掉下面args中的几个参数,修改后的内容如下:【kubectl apply -f mandatory.yaml】 顺便把authorization.k8s.io/v1beta1改为 authorization.k8s.io/v1

          terminationGracePeriodSeconds: 300
          serviceAccountName: nginx-ingress-serviceaccount
          hostNetwork: true #这个是添加的内容
          nodeSelector:
            node-role.kubernetes.io/edge: ''
            #kubernetes.io/os: linux
          containers:
            - name: nginx-ingress-controller
              image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
              args:
                - /nginx-ingress-controller
                - --configmap=$(POD_NAMESPACE)/nginx-configuration
                - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
                - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
                #- --publish-service=$(POD_NAMESPACE)/ingress-nginx # 注释掉的内容
                - --annotations-prefix=nginx.ingress.kubernetes.io

    其中nodeSelector是指可以在哪些node节点上运行ingress-controller的Pod。kubernetes.io/os: linux这个是默认值,你可以按需修改,os linux默认指所有node节点,因为k8s默认给所有节点打了这个label。

    你可以在master上使用命令kubectl get node --show-labels查看label,你也可以给具体的节点设置特定的label用在这里使用。比如kubernetes.io/hostname: 192.168.1.65 就是我只可能在这个节点上运行ingress-controller程序的的配置.

    5.Helm的安装

    内网环境可以手动下载安装,下载地址:https://github.com/kubernetes/helm/releases

    curl -O https://get.helm.sh/helm-v3.5.3-linux-amd64.tar.gz
    tar -zxvf helm-v3.5.3-linux-amd64.tar.gz
    cd linux-amd64/
    cp helm /usr/local/bin/

    6.安装Kuboard

    如果您已经有了 Kubernetes 集群,只需要一行命令即可安装 Kuboard:    kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml 然后访问您集群中任意节点的 32567 端口(http://any-of-your-node-ip:32567),即可打开 Kuboard 界面用一下命令获取token

    kubectl create clusterrolebinding serviceaccounts-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts
    kubectl create serviceaccount dashboard -n default
    kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard
    kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode

    windows技术爱好者
  • 相关阅读:
    IIS使用URL重写(URL Redirect)实现http跳转到https
    iis10中,安装URL重定向,却提示需要IIS7版本以上
    部署ABO+Angular框架要注意的问题
    idea中写Spring遇到internal error
    用微信小程序连接leancloud数据库注意事项~
    static解析
    Data Science Leetcode 精简版
    专题:二叉搜索树
    239. 滑动窗口最大值/双端队列/单调队列
    【转】关闭firefox火狐浏览器下载完成时自动扫描(49.0.2以后版本)
  • 原文地址:https://www.cnblogs.com/majiang/p/14617217.html
Copyright © 2011-2022 走看看