侧边栏壁纸
  • 累计撰写 247 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

使用 Kubeadm 安装 Kubernetes 单节点集群

kaixindeken
2021-02-23 / 0 评论 / 0 点赞 / 247 阅读 / 5,473 字

使用 kubeadm 工具在虚拟机上安装一个 ALL-In-One 类型的 Kubernetes 集群环境,也就是指这个环境中主要是安装了 Master,但是也可以作为一个 Node 节点使用。

  • 创建一台虚拟机

    • 本人使用 VMWare Fusion 创建 Centos 7.8 虚拟机)
    • 配置最小为 2 核 4GB 内存( Kubernetes 文档规定)
    • 选择任意桌面模式即可
  • 打通与宿主机的网络连接

    • 使用 NAT 模式无法设置静态 IP ,所以选择桥接模式。
    • 若两边互通,获取虚拟机 IP 地址,使用 ssh 工具连接 root 用户,设置虚拟机 IP 地址为静态。
    #修改虚拟机以太网配置文件一般为 ens33
    $ vim /etc/sysconfig/network-scripts/ifcfg-ens33
    

    Ifcfg-ens33 修改如下:

    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    #设置静态网络
    BOOTPROTO=static
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=ens33
    UUID=3062611e-41b4-4eef-8296-4fe929af8918
    DEVICE=ens33
    #开机启动
    ONBOOT=yes
    #设置IP地址、子网掩码、网关和DNS (DNS选择一个有名的即可)
    #每个机器上的IP地址不一,请在虚拟机使用 `ifconfig` 获取
    IPADDR=192.168.3.61
    NETMASK=255.255.255.0
    GATEWAY=192.168.3.1
    DNS1=119.29.29.29
    
    • 重启网络服务,并自行测试与外网和宿主机的连通性
    $ systemctl restart network.service
    
  • 安装 Docker

  • 配置内核模块和内核参数,并关闭 swapoff

    cat >> /etc/modules <<EOF
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack_ipv4
    br_netfilter
    EOF
    
    cat > /etc/sysctl.d/k8s.conf <<EOF
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    swapoff -a
    sed -i 's/.*swap.*/#&/' /etc/fstab
    
  • 安装 ipvsadmipset

    $ yum install -y ipvsadm ipset
    
  • 安装 kubeadmkubeletkubectl

  • 配置 Docker,注意 mirrors 的配置,关闭对 iptables 的配置。

    cat > /etc/docker/daemon.json <<EOF
    {
    "registry-mirrors": ["https://7uvhrdbm.mirror.aliyuncs.com"],
    "storage-driver": "overlay2",
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": { "max-size": "20m" }
    }
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    
  • 设置节点主机名为 kube-master:

    hostnamectl --static set-hostname  kube-master
    reboot   # 修改节点名后需要重启才能生效
    
  • 将节点的内网 IP/主机名加入 hosts 解析。

    192.168.3.61 kube-master
    
  • 关闭 firewalld

    $ systemctl stop firewalld
    $ systemctl disable firewalld
    $ modprobe br_netfilter
    
  • 使用 kubeadm 初始化集群,指定 pod 网段为 flannel 的默认网段

    $ kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version <对应版本>(如v1.19.2) --pod-network-cidr=10.244.0.0/16
    

    当集群初始化成功后,可以看到 kubeadm 已经提供如何在其中工作节点通过 kubeadm join 命令加入集群(可以记录下面以备后面的使用)。

  • 复制 kubectl 相关配置文件

    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    
  • 验证创建成功

    [root@kube-master ~]# kubectl get nodes
    NAME          STATUS     ROLES    AGE     VERSION
    kube-master   NotReady   master   2m40s   v1.15.5
    [root@kube-master ~]# kubectl get pods -n kube-system
    NAME                                  READY   STATUS    RESTARTS   AGE
    coredns-bccdc95cf-f2v2g               0/1     Pending   0          2m22s
    coredns-bccdc95cf-rvbnt               0/1     Pending   0          2m22s
    etcd-kube-master                      1/1     Running   0          101s
    kube-apiserver-kube-master            1/1     Running   0          85s
    kube-controller-manager-kube-master   1/1     Running   0          75s
    kube-proxy-4f8n4                      1/1     Running   0          2m22s
    kube-scheduler-kube-master            1/1     Running   0          92s
    
  • 安装 网络插件flannel

    由于 flannel 使用的镜像默认托管在 quay.io 上,有时国内访问速度可能会比较慢,所以可以先通过其他渠道将镜像拉取到本地,避免后续部署失败。在从 mirror 拉取镜像时,需要先看下 flannel.yaml 文件中指定的镜像版本是什么。

    $ docker pull registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/flannel:v0.12.0-amd64
    $ docker tag registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64
    $ wget https://labfile.oss.aliyuncs.com/courses/1494/kube-flannel.yml
    $ kubectl create -f kube-flannel.yml
    
  • 此时可以再次执行 kubectl get pods -n kube-system 验证网络插件是否部署成功,可以看到 coredns pod 已经变为 running 状态。

  • 移除 master 节点的 taint

    kubeadmMaster 上也安装了 kubelet,在默认情况下不参与工作负载,可以执行下面的命令让 Master 成为一个 Node

    $ kubectl taint nodes kube-master node-role.kubernetes.io/master-
    
  • 部署 Nginx 验证集群

    [root@kube-master ~]# kubectl create deployment nginx --image=nginx
    deployment.apps/nginx created
    [root@kube-master ~]# kubectl expose deploy nginx --type=NodePort --port=8080 --target-port=80 --name=nginx-svc
    service/nginx-svc exposed
    
    • 查看创建的 poddeployment 以及 service
    [root@kube-master ~]# kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-554b9c67f9-n7tgx   1/1     Running   0          9m41s
    [root@kube-master ~]# kubectl get deployments
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           9m50s
    [root@kube-master ~]# kubectl get services
    NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          30m
    nginx-svc    NodePort    10.97.22.179   <none>        8080:31001/TCP   18m
    
    • 可以发现 nginx 服务暴露在集群 IP 10.97.22.1798080 端口上,下面在节点上使用 curl 可以访问到 nginx
    [root@kube-master ~]# curl 10.97.22.179:8080
    
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
    }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
0

评论区