站長資訊網
        最全最豐富的資訊網站

        CentOS 7 上安裝配置 Kubernetes 集群

        安裝和配置 Kubernetes 集群的過程是比較繁瑣的,這里闡述在 Mac 上利用 virtualbox 配置 CentOS 7 上的 Kubernetes 集群的過程。

        目標

        我們需要搭建的 Kubernetes 集群目標和規格如下:

        • k8s 集群包含 4 個節點,一個 Master 節點, 3 個 Worker 節點
        • 主機為 Mac OS 10.14.5,所有節點的虛擬機在 VirtualBox 中實現
        • 節點的操作系統為 CentOS 7.6
        • 節點的配置為 CPU 1 核,內存 2G,硬盤 50G (動態分配)
        • 節點采用 NAT 網絡,劃分網段為 192.168.56.0/24
        • docker 的版本為 18.09.7
        • Kubernetes 的版本為 1.15.0
        • 由于宿主機不能與 NAT 網絡直接通信,宿主機與節點采用 Host-Only 網絡進行通信

        4 個節點的規劃如下

        主機名 IP 地址 Host-Only IP 地址 用途
        k8s-node1 192.168.56.11 192.168.7.11 master
        k8s-node2 192.168.56.12 192.168.7.12 worker
        k8s-node3 192.168.56.13 192.168.7.13 worker
        k8s-node4 192.168.56.14 192.168.7.14 worker

        開始之前

        請按照如下要求準備環境

        安裝 VirtualBox 6

        本文使用 VirtualBox 6 配置虛擬機,請自行安裝。

        設置 NAT 網絡

        1. 打開 VirtualBox, 按下快捷鍵 Command + ,, 或者點擊菜單 VirtualBox -> 偏好設置,打開偏好設置窗口, 然后進入網絡標簽,點擊 NAT 網絡列表右側的 添加新NAT網絡 按鈕,則添加了一個 NAT 網絡 NatNetwork, 如下圖

        2. 選中網絡 NatNetwork,點擊右側的編輯NAT網絡按鈕,修改字段“網絡 CIDR”的值為 192.168.56.0/24,然后點擊 OK 按鈕。如下圖

        現在 NAT 網絡就設置好了。

        設置 Host-Only 網絡

        1. 點擊菜單 管理 -> 主機網絡管理器,進入主機網絡管理器界面,點擊 創建 按鈕, 添加 vboxnet0 網絡,如下圖
        2. 切換到 網卡 標簽頁
          • “IPv4 地址” 修改為 192.168.7.1
          • “IPv4 網絡掩碼” 修改為 255.255.255.0
        3. 切換到 DHCP 服務器 標簽頁,選中 “啟用服務器”,按如下修改字段
          • “服務器地址” 修改為 192.168.7.2
          • “服務器網絡掩碼” 修改為 255.255.255.0
          • “最小地址” 修改為 192.168.7.11
          • “最大地址” 修改為 192.168.7.254

        這里設置最小地址為 192.168.7.11, 單純是為了和 NAT 服務器的地址的最后一位對應上,沒有其他的意義。

        現在已經設置好了 Host-Only 網絡

        創建和配置虛擬機

        下載 CentOS 7.6 鏡像

        請在 http://mirrors.163.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso 下載 CentOS 7.6 鏡像

        新建虛擬機節點

        1. 在 VirtualBox 中點擊新建虛擬機, 名稱命名成 k8s-node1,并配置成 CPU 1 核,內存 2G,硬盤 50G (動態分配)。
        2. 選擇啟動開始安裝 centos, 啟動后會讓提示選擇 剛剛下載的 centos 7.6 的 iso 文件。
        3. 等待完成安裝。
        4. 安裝完成后,進入虛擬機設置,切換到 網絡 標簽
          1. 啟用 網卡1,“連接方式”選擇 NAT 網絡, “界面名稱”選擇 NatNetwork。
          2. 啟用 網卡2,“連接方式”選擇 僅主機(Host-Only)網絡, “界面名稱”選擇 vboxnet0。

        此時虛擬機已經創建完畢,宿主如果想和虛擬機通信,需要通過 Host-Only 網絡的 IP 地址。

        可以通過一下命令查看 Host-Only 網絡的 IP 地址

        ip addr

        結果如下:

        1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00      inet 127.0.0.1/8 scope host lo         valid_lft forever preferred_lft forever      inet6 ::1/128 scope host          valid_lft forever preferred_lft forever  2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000      link/ether 08:00:27:14:21:b0 brd ff:ff:ff:ff:ff:ff      inet 192.168.56.11/24 brd 192.168.56.255 scope global noprefixroute enp0s3         valid_lft forever preferred_lft forever      inet6 fe80::7734:1bd6:9da6:5d1f/64 scope link noprefixroute          valid_lft forever preferred_lft forever  3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000      link/ether 08:00:27:1b:66:a7 brd ff:ff:ff:ff:ff:ff      inet 192.168.7.11/24 brd 192.168.7.255 scope global noprefixroute dynamic enp0s8         valid_lft 1153sec preferred_lft 1153sec      inet6 fe80::5f85:8418:37a4:f428/64 scope link noprefixroute          valid_lft forever preferred_lft forever

        則接口 enp0s8 為 Host-Only 的接口,ip 地址為 192.168.7.11 。

        配置節點 1

        由于以后安裝的需要,這里要做一些基礎的配置。

        1. 更新系統

          yum update -y

        2. 設置靜態 IP

          vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

          修改的內容如下

          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=enp0s3  DEVICE=enp0s3  ONBOOT=yes  IPADDR=192.168.56.11  GATEWAY=192.168.56.1  DNS1=192.168.56.1

          注意 BOOTPROTO=static 這一行是設置 IP 為靜態 IP。

        3. 停止并禁用防火墻

          systemctl stop firewalld  systemctl disable firewalld

        4. 關閉 SELinux

          setenforce 0  sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

        5. 設置主機名

          通過以下命令將本機的主機名修改為 k8s-node1

          echo k8s-node1 > /etc/hostname

          修改文件 /etc/hosts,將主機名 k8s-node1 添加到 hosts ,以便在本機能夠解析。效果如下:

          127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 k8s-node1  ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

        6. 關閉 swap, 并取消自動掛載 /swap

          swapoff -a && sysctl -w vm.swappiness=0  sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

        復制其他節點

        • 操作之前建議備份節點。
        • 此時也可以不進行節點復制,等 docker 和 kubelet, kubeadm, kubectl 的安裝完成后在進行節點復制更方便。

        在 VirtualBox 中復制 k8s-node1 節點為其他節點,其他節點的名稱分別為 k8s-node2, k8s-node3, k8s-node4。然后分別修改各個節點的如下項:

        1. 修改節點的固定 IP
        2. 修改節點的主機名 和 hosts 文件

        至此基礎環境已經安裝完畢,下一步進入到 docker 和 k8s 的安裝。

        安裝 docker

        此步驟要在所有的 4 個節點執行。

        1. 安裝依賴項

          yum install -y yum-utils device-mapper-persistent-data lvm2 deltarpm

        2. 添加阿里云的 yum 倉庫

          yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  yum makecache fast

        3. 安裝 docker

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

          完成后查看 docker 版本

          docker --version

          輸出結果為

          Docker version 18.09.7, build 2d0083d

          現在 docker 已經成功安裝了。

        4. 修改docker 的 cgroup 驅動為 systemd ,與k8s一致

          cat > /etc/docker/daemon.json <<EOF  {    "exec-opts": ["native.cgroupdriver=systemd"],    "log-driver": "json-file",    "log-opts": {      "max-size": "100m"    },    "storage-driver": "overlay2",    "storage-opts": [      "overlay2.override_kernel_check=true"    ]  }  EOF

        5. 重啟 docker ,并設置為隨機自啟動,請輸入:

          systemctl restart docker  systemctl enable docker

        安裝 kubelet kubeadm kubectl

        此步驟要在所有的 4 個節點執行。

        1. 添加 kubernetes YUM 倉庫,其中源修改為阿里云

          cat > /etc/yum.repos.d/kubernetes.repo <<EOF  [kubernetes]  name=Kubernetes  baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64  enabled=1  gpgcheck=0  repo_gpgcheck=0  gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg         http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg  EOF

        2. 安裝 kubelet, kubeadm, kubectl, ipvsadm

          yum install -y kubelet kubeadm kubectl ipvsadm

        3. 設置路由

          安裝路由工具包,并加載 br_netfilter 模塊

          yum install -y bridge-utils.x86_64  modprobe  br_netfilte

          設置路由

          cat > /etc/sysctl.d/k8s.conf <<EOF  net.bridge.bridge-nf-call-ip6tables = 1  net.bridge.bridge-nf-call-iptables = 1  net.ipv4.ip_forward = 1  EOF

          重新加載所有配置

          sysctl --system

        4. 啟動并設置隨機自動啟動

          systemctl start kubelet  systemctl enable kubelet

        配置 master 節點

        執行初始化操作

        執行如下命令來初始化 master 節點。

        kubeadm init   --apiserver-advertise-address=192.168.56.11   --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.15.0   --service-cidr=10.1.0.0/16   --pod-network-cidr=10.2.0.0/16   --service-dns-domain=cluster.local   --ignore-preflight-errors=Swap   --ignore-preflight-errors=NumCPU

        先看一下幾個重點的參數

        • –apiserver-advertise-address:指定用 Master 的 IP 地址與其他節點通信。
        • –service-cidr:指定 Service 負載均衡 VIP 使用的 IP 地址段。
        • –pod-network-cidr:指定 Pod 的 IP 地址段。
        • –image-repository:Kubenetes 默認 Registries 地址是 k8s.gcr.io,在國內并不能訪問 gcr.io,通過這個參數,將其指定為阿里云鏡像地址:registry.aliyuncs.com/google_containers。
        • –kubernetes-version=v1.13.3:指定要安裝的版本號。
        • –ignore-preflight-errors=:忽略運行時的錯誤,–ignore-preflight-errors=NumCPU 和 –ignore-preflight-errors=Swap 就是忽略 CPU 內核的數的限制和 Swap 的限制。

        整個過程可能會持續 5 分鐘左右,整個輸出的結果如下:

        [init] Using Kubernetes version: v1.15.0  [preflight] Running pre-flight checks  [WARNING NumCPU]: the number of available CPUs 1 is less than the required 2 [preflight] Pulling images required for setting up a Kubernetes cluster  [preflight] This might take a minute or two, depending on the speed of your internet connection  [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Activating the kubelet service  [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "etcd/ca" certificate and key  [certs] Generating "etcd/server" certificate and key  [certs] etcd/server serving cert is signed for DNS names [k8s-node1 localhost] and IPs [192.168.56.11 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key  [certs] Generating "etcd/peer" certificate and key  [certs] etcd/peer serving cert is signed for DNS names [k8s-node1 localhost] and IPs [192.168.56.11 127.0.0.1 ::1] [certs] Generating "apiserver-etcd-client" certificate and key  [certs] Generating "ca" certificate and key  [certs] Generating "apiserver-kubelet-client" certificate and key  [certs] Generating "apiserver" certificate and key  [certs] apiserver serving cert is signed for DNS names [k8s-node1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.1.0.1 192.168.56.11] [certs] Generating "front-proxy-ca" certificate and key  [certs] Generating "front-proxy-client" certificate and key  [certs] Generating "sa" key and public key  [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file  [kubeconfig] Writing "kubelet.conf" kubeconfig file  [kubeconfig] Writing "controller-manager.conf" kubeconfig file  [kubeconfig] Writing "scheduler.conf" kubeconfig file  [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s  [kubelet-check] Initial timeout of 40s passed.  [apiclient] All control plane components are healthy after 41.503341 seconds  [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace  [kubelet] Creating a ConfigMap "kubelet-config-1.15" in namespace kube-system with the configuration for the kubelets in the cluster  [upload-certs] Skipping phase. Please see --upload-certs  [mark-control-plane] Marking the node k8s-node1 as control-plane by adding the label "node-role.kubernetes.io/master=''" [mark-control-plane] Marking the node k8s-node1 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] [bootstrap-token] Using token: 5wf7mp.v61tv0s23ewbun1l  [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles  [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials  [bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token  [bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster  [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace  [addons] Applied essential addon: CoreDNS  [addons] Applied essential addon: kube-proxy    Your Kubernetes control-plane has initialized successfully!    To start using your cluster, you need to run the following as a regular user:      mkdir -p $HOME/.kube    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config    sudo chown $(id -u):$(id -g) $HOME/.kube/config    You should now deploy a pod network to the cluster.  Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:    https://kubernetes.io/docs/concepts/cluster-administration/addons/    Then you can join any number of worker nodes by running the following on each as root:    kubeadm join 192.168.56.11:6443 --token 5wf7mp.v61tv0s23ewbun1l       --discovery-token-ca-cert-hash sha256:ca524d88dbcc9a79c70c4cf21fba7252c0f12e5ab0fe9674e7f6998ab9fb5901 

        上面輸出的最后部分提示我們連個信息: – 需要執行幾個命令來在用戶目錄下建立配置文件 – 告訴我們其他節點加入集群的命令

        準備配置文件

        按照上面的執行結果中的要求,執行以下命令。

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

        在配置文件中,記錄了 API Server 的訪問地址,所以后面直接執行 kubectl 命令就可以正常連接到 API Server 中。

        使用以下命令查看組件的狀態

        kubectl get cs

        輸出結果如下

        NAME                 STATUS    MESSAGE             ERROR  scheduler            Healthy   ok                    controller-manager   Healthy   ok                    etcd-0               Healthy   {"health":"true"}   

        這里能夠正常返回結果,說明 API server 已經正常運行

        獲取 Node 信息

        kubectl get node

        輸出如下

        NAME        STATUS     ROLES    AGE     VERSION  k8s-node1   NotReady   master   6m48s   v1.15.0

        可以看出 k8s-node1 還是 NotReady 的狀態,這是因為還未安裝網絡插件?,F在進入網絡插件的安裝。

        部署網絡插件 canal

        插件的部署通過 kubectl 命令應用 yaml 配置文件。分別運行以下兩個命令。

        kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml

        輸出

        clusterrole.rbac.authorization.k8s.io/calico created  clusterrole.rbac.authorization.k8s.io/flannel created  clusterrolebinding.rbac.authorization.k8s.io/canal-flannel created  clusterrolebinding.rbac.authorization.k8s.io/canal-calico created

        kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml

        輸出

        configmap/canal-config created  daemonset.extensions/canal created  serviceaccount/canal created  customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created  customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created  customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created  customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created  customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created  customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created  customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created  customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created

        運行以下查看啟動的 Pod

        kubectl get pods --all-namespaces

        輸出為

        NAMESPACE     NAME                                READY   STATUS              RESTARTS   AGE  kube-system   canal-rj2fm                         0/3     ContainerCreating   0          44s  kube-system   coredns-bccdc95cf-rgtbx             0/1     Pending             0          11m  kube-system   coredns-bccdc95cf-x6j8l             0/1     Pending             0          11m  kube-system   etcd-k8s-node1                      1/1     Running             0          11m  kube-system   kube-apiserver-k8s-node1            1/1     Running             0          10m  kube-system   kube-controller-manager-k8s-node1   1/1     Running             0          10m  kube-system   kube-proxy-zcssq                    1/1     Running             0          11m  kube-system   kube-scheduler-k8s-node1            1/1     Running             0          10m

        可以看出 canal 正在創建容器, 而 coredns 處于 pending 狀態。 由于需要下載 canal 鏡像,所以需要一些時間,等鏡像下載完成后,則 coredns 的狀態變溫 Running 。

        需要注意的是,如果出現 ErrImagePull 等錯誤,則可能是由于 canal 鏡像由于在 google 服務器訪問不到的緣故,此時需要開啟 VPN 才能正常下載。

        等鏡像下載完成后,再次運行 kubectl get pods –all-namespaces , 則狀態都正常了,如下所示:

        NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE  kube-system   canal-rj2fm                         3/3     Running   0          35m  kube-system   coredns-bccdc95cf-rgtbx             1/1     Running   0          46m  kube-system   coredns-bccdc95cf-x6j8l             1/1     Running   0          46m  kube-system   etcd-k8s-node1                      1/1     Running   1          46m  kube-system   kube-apiserver-k8s-node1            1/1     Running   1          45m  kube-system   kube-controller-manager-k8s-node1   1/1     Running   1          45m  kube-system   kube-proxy-zcssq                    1/1     Running   1          46m  kube-system   kube-scheduler-k8s-node1            1/1     Running   1          45m

        此時再運行 kubectl get node 查看 master 節點的狀態,則狀態已經 Ready, 如下

        NAME        STATUS   ROLES    AGE   VERSION  k8s-node1   Ready    master   48m   v1.15.0

        部署 Worker 節點

        首先在 master 節點上執行以下命令來獲取在集群中添加節點的命令

        kubeadm token create --print-join-command

        輸出為

        kubeadm join 192.168.56.11:6443 --token eb0k80.qhqbjon1mh55w803     --discovery-token-ca-cert-hash sha256:ca524d88dbcc9a79c70c4cf21fba7252c0f12e5ab0fe9674e7f6998ab9fb5901 

        然后在每個 worker 節點上執行上面的命令,這個時候 kubernetes 會使用 DaemonSet 在所有節點上都部署 canal 和 kube-proxy。

        需要注意的是,如果出現 ErrImagePull 等錯誤,則可能是由于鏡像由于在 google 服務器訪問不到的緣故,此時需要開啟 VPN 才能正常下載。

        等待全部部署完畢,在 master 節點運行以下命令查看信息。

        查看所有 daemonset

        kubectl get daemonset --all-namespaces

        NAMESPACE     NAME         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE  kube-system   canal        4         4         4       4            4           beta.kubernetes.io/os=linux   16h  kube-system   kube-proxy   4         4         4       4            4           beta.kubernetes.io/os=linux   17h

        可以看到 READY 和 AVAILABLE 都是 4, 也就是 4 個節點都已經可用了。

        查看所有 Pod

        kubectl get pod --all-namespaces

        NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE  kube-system   canal-6w2zb                         3/3     Running   12         16h  kube-system   canal-jgw4m                         3/3     Running   47         16h  kube-system   canal-klmfs                         3/3     Running   33         16h  kube-system   canal-rj2fm                         3/3     Running   12         17h  kube-system   coredns-bccdc95cf-rgtbx             1/1     Running   3          17h  kube-system   coredns-bccdc95cf-x6j8l             1/1     Running   3          17h  kube-system   etcd-k8s-node1                      1/1     Running   4          17h  kube-system   kube-apiserver-k8s-node1            1/1     Running   6          17h  kube-system   kube-controller-manager-k8s-node1   1/1     Running   4          17h  kube-system   kube-proxy-7bk98                    1/1     Running   0          16h  kube-system   kube-proxy-cd8xj                    1/1     Running   0          16h  kube-system   kube-proxy-xfzfp                    1/1     Running   0          16h  kube-system   kube-proxy-zcssq                    1/1     Running   4          17h  kube-system   kube-scheduler-k8s-node1            1/1     Running   4          17h

        查看所有節點

        kubectl get node

        NAME        STATUS   ROLES    AGE   VERSION  k8s-node1   Ready    master   17h   v1.15.0  k8s-node2   Ready    <none>   16h   v1.15.0  k8s-node3   Ready    <none>   16h   v1.15.0  k8s-node4   Ready    <none>   16h   v1.15.0

        現在可以看到所有的節點已經運行 Ready 。

        測試集群

        通過上面的步驟,k8s 集群(1個 master 節點和 3 個 worker 節點)環境已經搭建完畢,并且所有的節點都得正常工作,現在我們要通過添加 Nginx 應用來測試集群。

        創建單 Pod 的 Nginx 應用

        kubectl create deployment nginx --image=nginx:alpine

        deployment.apps/nginx created

        查看 pod 詳情

        kubectl get pod -o wide

        NAME                   READY   STATUS    RESTARTS   AGE   IP         NODE        NOMINATED NODE   READINESS GATES  nginx-8f6959bd-6pth6   1/1     Running   0          73s   10.2.1.2   k8s-node2   <none>           <none>

        Pod 的 IP 地址是從 Master 節點初始化的參數 –pod-network-cidr=10.2.0.0/16 的地址段中分配的。

        訪問 nginx

        通過上面獲取的 Pod 的 ip 10.2.1.2 地址訪問 nginx

        curl -I http://10.2.1.2

        HTTP/1.1 200 OK  Server: nginx/1.17.1  Date: Thu, 18 Jul 2019 07:53:22 GMT  Content-Type: text/html  Content-Length: 612  Last-Modified: Tue, 25 Jun 2019 14:15:08 GMT  Connection: keep-alive  ETag: "5d122c6c-264"  Accept-Ranges: bytes

        擴容為 2 個 節點

        kubectl scale deployment nginx --replicas=2

        deployment.extensions/nginx scaled

        查看 pod

        kubectl get pod -o wide

        NAME                   READY   STATUS    RESTARTS   AGE     IP         NODE        NOMINATED NODE   READINESS GATES  nginx-8f6959bd-6pth6   1/1     Running   0          6m44s   10.2.1.2   k8s-node2   <none>           <none>  nginx-8f6959bd-l56n9   1/1     Running   0          28s     10.2.3.2   k8s-node4   <none>           <none>

        可以看到 Pod 已經有了兩個副本,每個副本都有各自的 IP, 通過 IP 訪問新增加的副本,照樣是可以提供服務的。

        curl -I http://10.2.3.2

        HTTP/1.1 200 OK  Server: nginx/1.17.1  Date: Thu, 18 Jul 2019 07:58:27 GMT  Content-Type: text/html  Content-Length: 612  Last-Modified: Tue, 25 Jun 2019 14:15:08 GMT  Connection: keep-alive  ETag: "5d122c6c-264"  Accept-Ranges: bytes

        **暴露為服務 **

        多個副本需要暴露為一個服務來統一對外提供服務,服務會創建一個Cluster IP,從 Master 節點初始化參數 –service-cidr=10.1.0.0/16 地址段中進行分配。服務會自動在在多個副本之間進行負載均衡。

        運行以下命令為 nginx 應用暴露服務,并開啟 NodePort 在所有節點上進行端口映射,進行外部訪問。

        kubectl expose deployment nginx --port=80 --type=NodePort

        service/nginx exposed

        運行以下命令看一下服務列表

        kubectl get service

        NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE  kubernetes   ClusterIP   10.1.0.1      <none>        443/TCP        19h  nginx        NodePort    10.1.59.105   <none>        80:32502/TCP   80s

        可以看到,nginx 服務的 vip 為 10.1.59.105, Node 節點上端口 32502 映射到 nginx 的 80 端口。

        運行以下命令,通過 vip 訪問服務

        curl -I http://10.1.59.105

        HTTP/1.1 200 OK  Server: nginx/1.17.1  Date: Thu, 18 Jul 2019 08:10:45 GMT  Content-Type: text/html  Content-Length: 612  Last-Modified: Tue, 25 Jun 2019 14:15:08 GMT  Connection: keep-alive  ETag: "5d122c6c-264"  Accept-Ranges: bytes

        在主機上運行以下命令通過節點的 IP 訪問服務

        curl -I http://192.168.7.11:32502

        HTTP/1.1 200 OK  Server: nginx/1.17.1  Date: Thu, 18 Jul 2019 08:14:31 GMT  Content-Type: text/html  Content-Length: 612  Last-Modified: Tue, 25 Jun 2019 14:15:08 GMT  Connection: keep-alive  ETag: "5d122c6c-264"  Accept-Ranges: bytes

        這里由于宿主機不能直接訪問 VirtualBox 的 NAT 網絡,采用的 Host-Only 網絡的 IP 進行訪問。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久91精品国产91久久麻豆| 免费精品视频在线| 精品久久久久一区二区三区| 国产午夜精品一区二区三区| 精品亚洲一区二区三区在线观看| 国产精品福利在线观看| 日韩精品无码熟人妻视频| 久久精品国产精品亚洲艾草网美妙 | 久久精品成人免费看| 亚洲精品97久久中文字幕无码| 国产一成人精品福利网站| 久久国产精品成人片免费| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲国产精品激情在线观看| 国产精品久久成人影院| 日产精品久久久久久久| 欧美日韩专区麻豆精品在线| 国产综合精品久久亚洲 | 久久夜色精品国产噜噜噜亚洲AV| 香蕉依依精品视频在线播放| 精品久久久久久无码中文字幕| 国产精品无码一区二区在线| 97精品在线播放| 国产成人综合精品一区| 成人一区二区三区精品| 成人国产精品日本在线观看| 国产成人精品曰本亚洲79ren| 999国产精品视频| 国产精品99久久精品爆乳| 丁香色婷婷国产精品视频| 99免费精品国产| 国产精品自在线拍国产第一页| 国产精品一区二区久久精品无码| 国产精品JIZZ在线观看老狼| 高清日韩精品一区二区三区| 国产乱子伦精品无码专区| 国产精品手机在线观看你懂的 | 999国产精品视频| 国产精品美女久久久久av爽| 国产精品无码专区在线观看| 久久99精品久久久久久野外|