安裝和配置 Kubernetes 集群的過程是比較繁瑣的,這里闡述在 Mac 上利用 virtualbox 配置 CentOS 7 上的 Kubernetes 集群的過程。
目標
我們需要搭建的 Kubernetes 集群目標和規(guī)格如下:
- k8s 集群包含 4 個節(jié)點,一個 Master 節(jié)點, 3 個 Worker 節(jié)點
- 主機為 Mac OS 10.14.5,所有節(jié)點的虛擬機在 VirtualBox 中實現(xiàn)
- 節(jié)點的操作系統(tǒng)為 CentOS 7.6
- 節(jié)點的配置為 CPU 1 核,內(nèi)存 2G,硬盤 50G (動態(tài)分配)
- 節(jié)點采用 NAT 網(wǎng)絡,劃分網(wǎng)段為 192.168.56.0/24
- docker 的版本為 18.09.7
- Kubernetes 的版本為 1.15.0
- 由于宿主機不能與 NAT 網(wǎng)絡直接通信,宿主機與節(jié)點采用 Host-Only 網(wǎng)絡進行通信
4 個節(jié)點的規(guī)劃如下
主機名 | 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 |
開始之前
請按照如下要求準備環(huán)境
安裝 VirtualBox 6
本文使用 VirtualBox 6 配置虛擬機,請自行安裝。
設置 NAT 網(wǎng)絡
-
打開 VirtualBox, 按下快捷鍵 Command + ,, 或者點擊菜單 VirtualBox -> 偏好設置,打開偏好設置窗口, 然后進入網(wǎng)絡標簽,點擊 NAT 網(wǎng)絡列表右側(cè)的 添加新NAT網(wǎng)絡 按鈕,則添加了一個 NAT 網(wǎng)絡 NatNetwork, 如下圖
-
選中網(wǎng)絡 NatNetwork,點擊右側(cè)的編輯NAT網(wǎng)絡按鈕,修改字段“網(wǎng)絡 CIDR”的值為 192.168.56.0/24,然后點擊 OK 按鈕。如下圖
現(xiàn)在 NAT 網(wǎng)絡就設置好了。
設置 Host-Only 網(wǎng)絡
- 點擊菜單 管理 -> 主機網(wǎng)絡管理器,進入主機網(wǎng)絡管理器界面,點擊 創(chuàng)建 按鈕, 添加 vboxnet0 網(wǎng)絡,如下圖
- 切換到 網(wǎng)卡 標簽頁
- “IPv4 地址” 修改為 192.168.7.1
- “IPv4 網(wǎng)絡掩碼” 修改為 255.255.255.0
- 切換到 DHCP 服務器 標簽頁,選中 “啟用服務器”,按如下修改字段
- “服務器地址” 修改為 192.168.7.2
- “服務器網(wǎng)絡掩碼” 修改為 255.255.255.0
- “最小地址” 修改為 192.168.7.11
- “最大地址” 修改為 192.168.7.254
這里設置最小地址為 192.168.7.11, 單純是為了和 NAT 服務器的地址的最后一位對應上,沒有其他的意義。
現(xiàn)在已經(jīng)設置好了 Host-Only 網(wǎng)絡
創(chuàng)建和配置虛擬機
下載 CentOS 7.6 鏡像
請在 http://mirrors.163.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso 下載 CentOS 7.6 鏡像
新建虛擬機節(jié)點
- 在 VirtualBox 中點擊新建虛擬機, 名稱命名成 k8s-node1,并配置成 CPU 1 核,內(nèi)存 2G,硬盤 50G (動態(tài)分配)。
- 選擇啟動開始安裝 centos, 啟動后會讓提示選擇 剛剛下載的 centos 7.6 的 iso 文件。
- 等待完成安裝。
- 安裝完成后,進入虛擬機設置,切換到 網(wǎng)絡 標簽
- 啟用 網(wǎng)卡1,“連接方式”選擇 NAT 網(wǎng)絡, “界面名稱”選擇 NatNetwork。
- 啟用 網(wǎng)卡2,“連接方式”選擇 僅主機(Host-Only)網(wǎng)絡, “界面名稱”選擇 vboxnet0。
此時虛擬機已經(jīng)創(chuàng)建完畢,宿主如果想和虛擬機通信,需要通過 Host-Only 網(wǎng)絡的 IP 地址。
可以通過一下命令查看 Host-Only 網(wǎng)絡的 IP 地址
ip addr
結(jié)果如下:
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 。
配置節(jié)點 1
由于以后安裝的需要,這里要做一些基礎的配置。
-
更新系統(tǒng)
yum update -y
-
設置靜態(tài) IP
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
修改的內(nèi)容如下
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 為靜態(tài) IP。
-
停止并禁用防火墻
systemctl stop firewalld systemctl disable firewalld
-
關閉 SELinux
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
-
設置主機名
通過以下命令將本機的主機名修改為 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
-
關閉 swap, 并取消自動掛載 /swap
swapoff -a && sysctl -w vm.swappiness=0 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
復制其他節(jié)點
- 操作之前建議備份節(jié)點。
- 此時也可以不進行節(jié)點復制,等 docker 和 kubelet, kubeadm, kubectl 的安裝完成后在進行節(jié)點復制更方便。
在 VirtualBox 中復制 k8s-node1 節(jié)點為其他節(jié)點,其他節(jié)點的名稱分別為 k8s-node2, k8s-node3, k8s-node4。然后分別修改各個節(jié)點的如下項:
- 修改節(jié)點的固定 IP
- 修改節(jié)點的主機名 和 hosts 文件
至此基礎環(huán)境已經(jīng)安裝完畢,下一步進入到 docker 和 k8s 的安裝。
安裝 docker
此步驟要在所有的 4 個節(jié)點執(zhí)行。
-
安裝依賴項
yum install -y yum-utils device-mapper-persistent-data lvm2 deltarpm
-
添加阿里云的 yum 倉庫
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast
-
安裝 docker
yum install -y docker-ce docker-ce-cli containerd.io
完成后查看 docker 版本
docker --version
輸出結(jié)果為
Docker version 18.09.7, build 2d0083d
現(xiàn)在 docker 已經(jīng)成功安裝了。
-
修改docker 的 cgroup 驅(qū)動為 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
-
重啟 docker ,并設置為隨機自啟動,請輸入:
systemctl restart docker systemctl enable docker
安裝 kubelet kubeadm kubectl
此步驟要在所有的 4 個節(jié)點執(zhí)行。
-
添加 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
-
安裝 kubelet, kubeadm, kubectl, ipvsadm
yum install -y kubelet kubeadm kubectl ipvsadm
-
設置路由
安裝路由工具包,并加載 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
-
啟動并設置隨機自動啟動
systemctl start kubelet systemctl enable kubelet
配置 master 節(jié)點
執(zhí)行初始化操作
執(zhí)行如下命令來初始化 master 節(jié)點。
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
先看一下幾個重點的參數(shù)
- –apiserver-advertise-address:指定用 Master 的 IP 地址與其他節(jié)點通信。
- –service-cidr:指定 Service 負載均衡 VIP 使用的 IP 地址段。
- –pod-network-cidr:指定 Pod 的 IP 地址段。
- –image-repository:Kubenetes 默認 Registries 地址是 k8s.gcr.io,在國內(nèi)并不能訪問 gcr.io,通過這個參數(shù),將其指定為阿里云鏡像地址:registry.aliyuncs.com/google_containers。
- –kubernetes-version=v1.13.3:指定要安裝的版本號。
- –ignore-preflight-errors=:忽略運行時的錯誤,–ignore-preflight-errors=NumCPU 和 –ignore-preflight-errors=Swap 就是忽略 CPU 內(nèi)核的數(shù)的限制和 Swap 的限制。
整個過程可能會持續(xù) 5 分鐘左右,整個輸出的結(jié)果如下:
[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
上面輸出的最后部分提示我們連個信息: – 需要執(zhí)行幾個命令來在用戶目錄下建立配置文件 – 告訴我們其他節(jié)點加入集群的命令
準備配置文件
按照上面的執(zhí)行結(jié)果中的要求,執(zhí)行以下命令。
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
在配置文件中,記錄了 API Server 的訪問地址,所以后面直接執(zhí)行 kubectl 命令就可以正常連接到 API Server 中。
使用以下命令查看組件的狀態(tài)
kubectl get cs
輸出結(jié)果如下
NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"}
這里能夠正常返回結(jié)果,說明 API server 已經(jīng)正常運行
獲取 Node 信息
kubectl get node
輸出如下
NAME STATUS ROLES AGE VERSION k8s-node1 NotReady master 6m48s v1.15.0
可以看出 k8s-node1 還是 NotReady 的狀態(tài),這是因為還未安裝網(wǎng)絡插件?,F(xiàn)在進入網(wǎng)絡插件的安裝。
部署網(wǎng)絡插件 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 正在創(chuàng)建容器, 而 coredns 處于 pending 狀態(tài)。 由于需要下載 canal 鏡像,所以需要一些時間,等鏡像下載完成后,則 coredns 的狀態(tài)變溫 Running 。
需要注意的是,如果出現(xiàn) ErrImagePull 等錯誤,則可能是由于 canal 鏡像由于在 google 服務器訪問不到的緣故,此時需要開啟 VPN 才能正常下載。
等鏡像下載完成后,再次運行 kubectl get pods –all-namespaces , 則狀態(tài)都正常了,如下所示:
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 節(jié)點的狀態(tài),則狀態(tài)已經(jīng) Ready, 如下
NAME STATUS ROLES AGE VERSION k8s-node1 Ready master 48m v1.15.0
部署 Worker 節(jié)點
首先在 master 節(jié)點上執(zhí)行以下命令來獲取在集群中添加節(jié)點的命令
kubeadm token create --print-join-command
輸出為
kubeadm join 192.168.56.11:6443 --token eb0k80.qhqbjon1mh55w803 --discovery-token-ca-cert-hash sha256:ca524d88dbcc9a79c70c4cf21fba7252c0f12e5ab0fe9674e7f6998ab9fb5901
然后在每個 worker 節(jié)點上執(zhí)行上面的命令,這個時候 kubernetes 會使用 DaemonSet 在所有節(jié)點上都部署 canal 和 kube-proxy。
需要注意的是,如果出現(xiàn) ErrImagePull 等錯誤,則可能是由于鏡像由于在 google 服務器訪問不到的緣故,此時需要開啟 VPN 才能正常下載。
等待全部部署完畢,在 master 節(jié)點運行以下命令查看信息。
查看所有 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 個節(jié)點都已經(jīng)可用了。
查看所有 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
查看所有節(jié)點
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
現(xiàn)在可以看到所有的節(jié)點已經(jīng)運行 Ready 。
測試集群
通過上面的步驟,k8s 集群(1個 master 節(jié)點和 3 個 worker 節(jié)點)環(huán)境已經(jīng)搭建完畢,并且所有的節(jié)點都得正常工作,現(xiàn)在我們要通過添加 Nginx 應用來測試集群。
創(chuàng)建單 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 節(jié)點初始化的參數(shù) –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 個 節(jié)點
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 已經(jīng)有了兩個副本,每個副本都有各自的 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
**暴露為服務 **
多個副本需要暴露為一個服務來統(tǒng)一對外提供服務,服務會創(chuàng)建一個Cluster IP,從 Master 節(jié)點初始化參數(shù) –service-cidr=10.1.0.0/16 地址段中進行分配。服務會自動在在多個副本之間進行負載均衡。
運行以下命令為 nginx 應用暴露服務,并開啟 NodePort 在所有節(jié)點上進行端口映射,進行外部訪問。
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 節(jié)點上端口 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
在主機上運行以下命令通過節(jié)點的 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 網(wǎng)絡,采用的 Host-Only 網(wǎng)絡的 IP 進行訪問。