Kubernetes入门一:介绍及环境准备
Kubernetes學習筆記
本節(jié)主要介紹:
- Kubernetes的一些基礎(chǔ)知識
- Kubernetes集群搭建的相關(guān)操作內(nèi)容
前言
1. 部署的演變過程:
整個部署的演變過程如圖所示:
-
傳統(tǒng)部署時代:
- 在物理機服務(wù)器上運行應(yīng)用程序
- 無法為應(yīng)用程序定義資源邊界
- 導(dǎo)致資源分配問題
如果在物理服務(wù)器上運行多個應(yīng)用程序,則可能會出現(xiàn)一個應(yīng)用程序占用大部分資源的情況下,會導(dǎo)致其它應(yīng)用程序的性能下降。一種解決方案就是在不同的物理服務(wù)器上運行每個應(yīng)用程序,但是由于資源利用不足而無法擴展,并且維護許多物理服務(wù)器的成本也很高。
-
虛擬化部署
- 虛擬化技術(shù)允許在單個物理服務(wù)器的 CPU 上運行多個虛擬機
- 虛擬化允許應(yīng)用程序在虛擬機之間隔離,并提供一定程序上的安全,應(yīng)用程序之間不會被隨意訪問
- 虛擬化技術(shù)能夠更好的利用物理服務(wù)器上的資源
- 每個虛擬機都是一臺完整的計算機,在虛擬化硬件之上運行所有組件,包括自己的操作系統(tǒng)等
缺點:每臺虛擬機都有各自的操作系統(tǒng)等,虛擬層冗余,導(dǎo)致資源浪費和性能下降。
-
容器化部署
- 容器類似于虛擬機 ,但是可以在應(yīng)用程序之間共享操作系統(tǒng) (操作系統(tǒng)只有一份,各個程序之間共享)
- 容器和虛擬機類似,具有自己的文件系統(tǒng)、CPU 、內(nèi)存、進程空間等
- 由于容器和基礎(chǔ)架構(gòu)分離,因為可以很方便的進行跨云和跨 Linux 發(fā)行版進行移植、
1、kubernetes介紹
1.1 概述
? kubernetes (k8s)是一個可移植的、可擴展的開源平臺,用于管理容器化的工作負載和服務(wù),可促進聲明式配置和自動化。Kubernetes 擁有一個龐大且快速增長的生態(tài)系統(tǒng)。Kubernetes 的服務(wù)、支持和工具廣泛可用。k8s 這個縮寫是因為 k 和 s 之間有八個字符的關(guān)系。
Kubernetes 為我們提供下面的功能:
- 自我修復(fù):一旦某一個容器崩潰,能夠在1秒中左右迅速啟動新的容器
- 彈性伸縮:可以根據(jù)需要,自動對集群中正在運行的容器數(shù)量進行調(diào)整
- 服務(wù)發(fā)現(xiàn):服務(wù)可以通過自動發(fā)現(xiàn)的形式找到它所依賴的服務(wù)
- 負載均衡:如果一個服務(wù)起動了多個容器,能夠自動實現(xiàn)請求的負載均衡
- 版本回退:如果發(fā)現(xiàn)新發(fā)布的程序版本有問題,可以立即回退到原來的版本
- 存儲編排:可以根據(jù)容器自身的需求自動創(chuàng)建存儲卷
1.2 kubernetes組件
一個kubernetes集群主要是由控制節(jié)點(master)、**工作節(jié)點(node)**構(gòu)成,每個節(jié)點上都會安裝不同的組件。
master:集群的控制平面,負責集群的決策 ( 管理 )
ApiServer : 資源操作的唯一入口,接收用戶輸入的命令,提供認證、授權(quán)、API注冊和發(fā)現(xiàn)等機制
Scheduler : 負責集群資源調(diào)度,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的node節(jié)點上
ControllerManager : 負責維護集群的狀態(tài),比如程序部署安排、故障檢測、自動擴展、滾動更新等
Etcd :負責存儲集群中各種資源對象的信息
node:集群的數(shù)據(jù)平面,負責為容器提供運行環(huán)境 ( 干活 )
Kubelet : 負責維護容器的生命周期,即通過控制docker,來創(chuàng)建、更新、銷毀容器
KubeProxy : 負責提供集群內(nèi)部的服務(wù)發(fā)現(xiàn)和負載均衡
pod:Pod 是對容器的再一次封裝,一個pod可以包含多個container
- docker run 啟動的是一個 container(容器),容器是 Docker 的基本單位,一個應(yīng)用就是一個容器
- kubectl run 啟動的是一個應(yīng)用稱為一個 Pod ,Pod 是 Kubernetes 的基本單位。
Docker : 負責節(jié)點上容器的各種操作
下面,以部署一個nginx服務(wù)來說明kubernetes系統(tǒng)各個組件調(diào)用關(guān)系:
首先要明確,一旦kubernetes環(huán)境啟動之后,master和node都會將自身的信息存儲到etcd數(shù)據(jù)庫中
一個nginx服務(wù)的安裝請求會首先被發(fā)送到master節(jié)點的apiServer組件
apiServer組件會調(diào)用scheduler組件來決定到底應(yīng)該把這個服務(wù)安裝到哪個node節(jié)點上
在此時,它會從etcd中讀取各個node節(jié)點的信息,然后按照一定的算法進行選擇,并將結(jié)果告知apiServer
apiServer調(diào)用controller-manager去調(diào)度Node節(jié)點安裝nginx服務(wù)
kubelet接收到指令后,會通知docker,然后由docker來啟動一個nginx的pod
pod是kubernetes的最小操作單元,容器必須跑在pod中至此,
一個nginx服務(wù)就運行了,如果需要訪問nginx,就需要通過kube-proxy來對pod產(chǎn)生訪問的代理
這樣,外界用戶就可以訪問集群中的nginx服務(wù)了
1.3 kubernetes名詞解釋
-
Master:集群控制節(jié)點,每個集群需要至少一個master節(jié)點負責集群的管控
-
Node:工作負載節(jié)點,由master分配容器到這些node工作節(jié)點上,然后node節(jié)點上的docker負責容器的運行
-
Pod:kubernetes的最小控制單元,容器都是運行在pod中的,一個pod中可以有1個或者多個容器
-
Controller:控制器,通過它來實現(xiàn)對pod的管理,比如啟動pod、停止pod、伸縮pod的數(shù)量等等
-
Service:pod對外服務(wù)的統(tǒng)一入口,下面可以維護者同一類的多個pod
-
Label:標簽,用于對pod進行分類,同一類pod會擁有相同的標簽
-
NameSpace:命名空間,用來隔離pod的運行環(huán)境
2、集群環(huán)境搭建
2.1 整體介紹
1. 集群類型:
kubernetes集群大體上可以分為兩類:
- **一主多從:**一臺master節(jié)點和多臺node節(jié)點,該方式搭建簡單,一旦主機master出現(xiàn)故障異常,整個集群會宕機,較為適用于測試環(huán)境。
- 多主多從: 多臺master節(jié)點和多臺node節(jié)點,該方式搭建較為復(fù)雜,但是具有較高的安全性,一旦一個master節(jié)點出現(xiàn)故障,其他master可以立馬頂上去,保證集群正常運轉(zhuǎn),多用于生產(chǎn)環(huán)境。
2. 搭建方式
Kubernetes 有多種部署方式,目前主流的方式有 kubeadm 、minikube 、二進制包。
-
minikube:一個用于快速搭建單節(jié)點的 Kubernetes 工具。
-
kubeadm:一個用于快速搭建Kubernetes 集群的工具(可以用于生產(chǎn)環(huán)境)。
-
二進制包:從官網(wǎng)上下載每個組件的二進制包,依次去安裝(建議生產(chǎn)環(huán)境使用)。
kubeadm 是官方社區(qū)推出的一個用于快速部署kubernetes 集群的工具,這個工具能通過兩條指令完成一個kubernetes 集群的部署:
- 創(chuàng)建一個Master 節(jié)點kubeadm init
- 將Node 節(jié)點加入到當前集群中$ kubeadm join <Master 節(jié)點的IP 和端口>
本次搭建 采用kubeadm的方式進行
3. 主機規(guī)劃
| master | 192.168.79.100 | CentOS7.9 + 基礎(chǔ)設(shè)施服務(wù)器 | 2核2G 20G |
| node1 | 192.168.79.101 | CentOS7.9 + 基礎(chǔ)設(shè)施服務(wù)器 | 2核2G 20G |
| node2 | 192.168.79.102 | CentOS7.9 + 基礎(chǔ)設(shè)施服務(wù)器 | 2核2G 20G |
本次集群搭建:3臺CentOS服務(wù)器,一個master,兩個node(一主二從)CentOS 7.9 基礎(chǔ)設(shè)施服務(wù)器
每臺服務(wù)器安裝docker(18.06.3);kubeadm(1.17.4); kubelet (1.17.4); kubectl (1.17.4)
- 集群中所有機器之間網(wǎng)絡(luò)互通
- 可以訪問外網(wǎng),需要拉取鏡像
- 禁止swap 分區(qū)
2.2、VM Ware安裝CentOS 7
VMWare安裝CentOS7并配置IP地址步驟:
軟件下載地址:
CentOS7 阿里云下載地址: 點我下載CentOS7鏡像
VM Ware:云盤鏈接:云盤下載鏈接 提取碼:5lgm
通過VM軟件分別安裝3臺CentOS服務(wù)器,一臺為master,兩臺為Node。以其中一臺為例,具體安裝過程見另一篇文章:
CentOS7安裝詳細過程
點我查看CentOS7詳細安裝過程
2.3 環(huán)境初始化
三臺CentOS服務(wù)器安裝完畢之后 如圖所示,可以通過MobaXterm軟件進行連接,可以同時操作三臺機器。
查看CentOS安裝版本,確保為CentOS7以上
# 此方式安裝k8s集群要求CentOS 版本必須在7.5以之上,本次使用7.9版本 [root@master ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) [root@master ~]#主機域名解析
方便后面集群節(jié)點之間的直接調(diào)用訪問,配置一下主機域名解析
#編輯三臺服務(wù)器的/etc/hosts文件,在里面添加如下內(nèi)容: 192.168.79.100 master 192.168.79.101 node1 192.168.79.102 node2時間同步
k8s要求集群中的節(jié)點時間必須精確一直,使用chronyd服務(wù)從網(wǎng)絡(luò)同步時間
# 啟動chronyd服務(wù) [root@master ~]# systemctl start chronyd # 將其設(shè)置為開機自啟動 [root@master ~]# systemctl enable chronyd # 查看當前三臺機器的時間(只展示其中master一臺) [root@master ~]# date 2022年 07月 01日 星期五 13:04:36 CST禁用iptables和firewalld服務(wù)
k8s和docker會在運行中產(chǎn)生大量的iptables規(guī)則,為了不和系統(tǒng)規(guī)則混淆,直接關(guān)閉系統(tǒng)的規(guī)則
# 關(guān)閉firewalld [root@master ~]# systemctl stop firewalld # 設(shè)置為開啟禁止自啟 [root@master ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. # 關(guān)閉iptables (本機器沒有iptales) [root@master ~]# systemctl stop iptables Failed to stop iptables.service: Unit iptables.service not loaded.禁用selinux
selinux是linux系統(tǒng)下的一個安全服務(wù),如果不關(guān)閉它,在安裝集群時會產(chǎn)生各種各樣的問題。
# 編輯注冊表/etc/selinux/config文件,修改SELINUX的值為disabled 修改完之后需要重啟Linux服務(wù)才能生效# 當前為開啟狀態(tài) [root@master ~]# getenforce Enforcing # [root@master ~]# vim /etc/selinux/config # 進入該文件進行修改禁用swap分區(qū)
swap分區(qū)是虛擬內(nèi)存分區(qū),在物理內(nèi)存使用完畢之后,將磁盤空間虛擬成內(nèi)存來使用。啟動swap設(shè)備會對系統(tǒng)性能產(chǎn)生影響,因此直接禁用swap分區(qū)
# 編輯分區(qū)的配置文件/etc/fstab 注釋掉swap分區(qū)這一行內(nèi)容,修改之后需要重啟服務(wù) [root@master ~]# vim /etc/fstab修改Linux內(nèi)核參數(shù)
#修改Linux的內(nèi)核參數(shù),添加網(wǎng)橋過濾和地址轉(zhuǎn)發(fā)功能 # 編輯(新建)/etc/sysctl.d/kubernetes.conf文件,添加如下配置 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1# 保存退出之后重新加載配置 [root@master ~]# sysctl -p# 加載網(wǎng)橋過濾模塊 [root@master ~]# modprobe br_netfilter# 查看該模塊是否加載成功 [root@master ~]# lsmod | grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter配置ipvs功能
在k8s中service有兩種代理模式,一種是基于iptables的,一種是基于ipvs的,兩者比較來說,ipvs的性能較高一些,使用該模式,需要手動載入ipvs模塊
# 1.安裝ipset和ipvsadm [root@master ~]# yum install ipset ipvsadmin -y 已加載插件:fastestmirror, langpacks Determining fastest mirrors* base: mirrors.aliyun.com* extras: mirrors.aliyun.com* updates: mirrors.aliyun.com base | 3.6 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 (1/4): base/7/x86_64/primary_db | 6.1 MB 00:00:00 (2/4): base/7/x86_64/group_gz | 153 kB 00:00:00 (3/4): extras/7/x86_64/primary_db | 247 kB 00:00:00 (4/4): updates/7/x86_64/primary_db | 16 MB 00:00:18 軟件包 ipset-7.1-1.el7.x86_64 已安裝并且是最新版本 沒有可用軟件包 ipvsadmin。 無須任何處理# 2.添加需要加載的模塊寫入腳本文件 [root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules > #!/bin/bash > modprobe -- ip_vs > modprobe -- ip_vs_rr > modprobe -- ip_vs_wrr > modprobe -- ip_vs_sh > modprobe -- nf_conntrack_ipv4 > EOF# 3. 為腳本文件添加執(zhí)行權(quán)限 [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules# 4. 執(zhí)行腳本文件 [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules# 5. 查看對應(yīng)模塊是否加載成功 [root@node2 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 15053 0 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4 ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4 libcrc32c 12644 3 xfs,ip_vs,nf_conntrack [root@master ~]#重啟服務(wù)器
[root@master ~]# reboot重啟服務(wù)后 查看selinux是否關(guān)閉成功
# 顯示Disabled 關(guān)閉成功 [root@master ~]# getenforce Disabled2.4 安裝docker
docker的官方鏡像源速度較慢,切換為阿里云的鏡像源
# 切換為阿里云的鏡像源 [root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo查看當前鏡像源中支持的docker版本
# 支持的docker版本,本次選擇 docker-ce-18.06.3.ce-3.el7 [root@master ~]# yum list docker-ce --showduplicates [root@master ~]#安裝指定版本的docker-ce
# --setopt=obsoletes=0 表示指定安裝對應(yīng)版本 [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y添加一個配置文件
# Docker 默認情況下使用Cgroupfs,而k8s推薦使用systemd來替代cgroupfs, 更換下載的鏡像源 [root@master ~]# mkdir /etc/docker[root@master ~]# cat <<EOF> /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"] } EOF啟動docker
# 啟動docker [root@master ~]# systemctl restart docker # 設(shè)置為開機自啟 [root@master ~]# systemctl enable docker檢查docker的狀態(tài)和版本信息
#檢查版本信息 [root@master ~]# docker version Client:Version: 18.06.3-ceAPI version: 1.38Go version: go1.10.3Git commit: d7080c1Built: Wed Feb 20 02:26:51 2019OS/Arch: linux/amd64Experimental: falseServer:Engine:Version: 18.06.3-ceAPI version: 1.38 (minimum version 1.12)Go version: go1.10.3Git commit: d7080c1Built: Wed Feb 20 02:28:17 2019OS/Arch: linux/amd64Experimental: false [root@master ~]#2.5 安裝kubernetes組件
切換k8s鏡像源
# k8s鏡像源在國外,下載速度較慢,切換為阿里云的 # 編輯(新建文件)/etc/yum.repos.d/kubernetes.repo, 添加如下的配置: [root@master ~]# vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg安裝kubeadm、kubectl、kubelet
# 安裝指定版本 1.17.4 [root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y修改配置文件
# 配置kubelet的cgroup, 編輯/etc/sysconfig/kubelet,添加如下配置: [root@master ~]# vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"設(shè)置kubelet為開機自啟
[root@master ~]# systemctl enable kubelet前面2.2-2.5的所有內(nèi)容需要在三臺虛擬機上都進行操作,做一個搭建集群環(huán)境的準備
2.6 集群初始化
開始對集群進行初始化,將node節(jié)點加入到集群中,下面所有步驟只需要在master節(jié)點進行操作即可
創(chuàng)建集群
# 由于默認拉取鏡像地址k8s.gcr.io國內(nèi)無法訪問,這里需要指定阿里云鏡像倉庫地址 [root@master ~]# kubeadm init --kubernetes-version=v1.17.4 --apiserver-advertise-address=192.168.79.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 # 下面是執(zhí)行命令之后的運行結(jié)果 W0701 15:41:54.850536 9562 validation.go:28] Cannot validate kube-proxy config - no validator is available W0701 15:41:54.850592 9562 validation.go:28] Cannot validate kubelet config - no validator is available [init] Using Kubernetes version: v1.17.4 [preflight] Running pre-flight checks [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] Starting the kubelet [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "ca" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.79.100] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-ca" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/ca" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [master localhost] and IPs [192.168.79.100 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [master localhost] and IPs [192.168.79.100 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-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" W0701 15:42:21.370847 9562 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC" [control-plane] Creating static Pod manifest for "kube-scheduler" W0701 15:42:21.371810 9562 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC" [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 [apiclient] All control plane components are healthy after 15.006014 seconds [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config-1.17" 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 master as control-plane by adding the label "node-role.kubernetes.io/master=''" [mark-control-plane] Marking the node master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] [bootstrap-token] Using token: l8o7vp.gbiatmb3iexxbppo [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 [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key [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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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/# 將任意多的worker nodes加入到根中 Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo \--discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9創(chuàng)建必要文件:
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 集群創(chuàng)建完畢之后顯示下面這段提示, # 需要運行下面這段話 To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config[root@master ~]# mkdir -p $HOME/.kube [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config# 此時查看node會發(fā)現(xiàn)這個集群只有一個master節(jié)點,需要將node節(jié)點加入到集群中 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 4m51s v1.17.4 [root@master ~]#將node的節(jié)點加入到集群,需要將如下命令在node1和node2中進行執(zhí)行
# 將任意多的worker nodes加入到根中 Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo \--discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9# 分別在node1和node2中運行這兩句命令 [root@node1 ~]# kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9[root@node2 ~]# kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9#加入到集群之后,查看master機器中集群的節(jié)點信息:此時顯示所有的node均已添加進來,但是還處于NotReady的狀態(tài),需要添加網(wǎng)絡(luò)插件 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 8m9s v1.17.4 node1 NotReady <none> 14s v1.17.4 node2 NotReady <none> 31s v1.17.4 [root@master ~]#配置網(wǎng)絡(luò)插件
# 下載網(wǎng)絡(luò)插件到y(tǒng)ml文件中 [root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 控制臺的執(zhí)行結(jié)果如下 --2022-07-01 15:53:27-- https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 正在解析主機 raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ... 正在連接 raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... 已連接。 已發(fā)出 HTTP 請求,正在等待回應(yīng)... 200 OK 長度:5750 (5.6K) [text/plain] 正在保存至: “kube-flannel.yml”100%[=======================================================================================================================================================================>] 5,750 --.-K/s 用時 0s2022-07-01 15:53:28 (18.3 MB/s) - 已保存 “kube-flannel.yml” [5750/5750])# 將文件應(yīng)用 apply命令 [root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 執(zhí)行過程 podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created# 新開master的控制臺窗口, 查看運行進度條情況 [root@master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-9d85f5447-4r5vf 0/1 ContainerCreating 0 12m coredns-9d85f5447-r9k4g 0/1 ContainerCreating 0 12m etcd-master 1/1 Running 0 12m kube-apiserver-master 1/1 Running 0 12m kube-controller-manager-master 1/1 Running 0 12m kube-flannel-ds-298ct 1/1 Running 0 61s kube-flannel-ds-z6whb 1/1 Running 0 61s kube-flannel-ds-zl4mx 1/1 Running 0 61s kube-proxy-9m6xw 1/1 Running 0 12m kube-proxy-mhssb 1/1 Running 0 5m23s kube-proxy-mnn62 1/1 Running 0 5m6s kube-scheduler-master 1/1 Running 0 12m # 查看nodes的狀態(tài)顯示處于Ready狀態(tài) [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 13m v1.17.4 node1 Ready <none> 5m46s v1.17.4 node2 Ready <none> 6m3s v1.17.4# 所有組件處于running運行狀態(tài) [root@master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-9d85f5447-4r5vf 1/1 Running 0 13m coredns-9d85f5447-r9k4g 1/1 Running 0 13m etcd-master 1/1 Running 0 13m kube-apiserver-master 1/1 Running 0 13m kube-controller-manager-master 1/1 Running 0 13m kube-flannel-ds-298ct 1/1 Running 0 111s kube-flannel-ds-z6whb 1/1 Running 0 111s kube-flannel-ds-zl4mx 1/1 Running 0 111s kube-proxy-9m6xw 1/1 Running 0 13m kube-proxy-mhssb 1/1 Running 0 6m13s kube-proxy-mnn62 1/1 Running 0 5m56s kube-scheduler-master 1/1 Running 0 13m [root@master ~]#至此,整個集群已經(jīng)全部搭建完畢
2.6 集群測試
部署nginx進行集群環(huán)境的測試
# 1. 部署nginx 版本 1.14-alpine [root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine deployment.apps/nginx created# 2. 暴露端口 [root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed# 3. 查看服務(wù)狀態(tài) 一個pod已經(jīng)正在運行, service服務(wù)處于運行狀態(tài) [root@master ~]# kubectl get pods,svc NAME READY STATUS RESTARTS AGE pod/nginx-6867cdf567-ppmrj 1/1 Running 0 60sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18m service/nginx NodePort 10.104.243.191 <none> 80:30134/TCP 43s# 4. 獲取集群的pod信息 [root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-6867cdf567-ppmrj 1/1 Running 0 81s [root@master ~]## 5. 根據(jù)暴露的端口,可以通過瀏覽器訪問部署的nginx # 訪問地址為: 192.168.79.100:30134 # 訪問結(jié)果如下圖所示:成功訪問到部署的nginx頁面,部署成功總結(jié)
以上是生活随笔為你收集整理的Kubernetes入门一:介绍及环境准备的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes集群部署篇( 一)
- 下一篇: 程序人生丨如何体现测试工程师的价值