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技术爱好者
  • 相关阅读:
    Java核心技术 卷一 笔记四 库类的直接使用
    Java核心技术 卷一 笔记三 大数值及数组
    Java核心技术 卷一 笔记2 字符串的复制
    Java核心技术 卷一 笔记1
    修改css 样式后, hover事件 不生效
    修改 element ui input 输入框 样式不生效问题
    css3 计算属性
    Vue3 改动系列
    浏览器实现,向下滑动 鼠标滚轮,页面横向移动
    linux ceont0s7 vue 打包压缩图片 一直报错
  • 原文地址:https://www.cnblogs.com/majiang/p/14617217.html
Copyright © 2011-2022 走看看