一、k8s基礎概念與安裝
k8s,即kubernetes是用於自動部署,擴充套件和管理容器化應用程式的開源系統。詳細的描述就不多說了,官網有更詳細的內容。簡單來說,k8s,是一個可以操作多臺機器排程部署映象的平臺。在k8s中,可以使用叢集來組織伺服器。叢集中會存在一個master節點,該節點是kubernetes的控制節點,負責排程伺服器中被稱為Node的其他資源。
下面,我們就正式開始k8s的學習。
首先,我們需要兩臺伺服器,一個是master,一個是node。master伺服器的配置要稍微高些,2核4G就差不多了,如果不是長時間用的話,可以買按量付費,用完了給它關了就好了。
購買好伺服器後,我們需要給兩臺伺服器預先安裝一些依賴工具:
yum install vim wget ntpdate -y
vim和wget就不說了,之前的內容也都有使用過,ntpdate是用來同步時區的。然後,我們還需要關閉防火牆,因為k8s會建立防火牆規則:
systemctl stop firewalld & systemctl disable firewalld
然後,關閉swap分割槽,Swap 是 Linux 的交換分割槽,在系統資源不足時,Swap 分割槽會啟用,這個我們不需要。應該讓新建立的服務自動排程到叢集的其他 Node 節點中去,而不是使用 Swap 分割槽。
#臨時關閉
swapoff -a
關閉Selinux,這是為了支援容器可以訪問宿主機檔案系統。
# 暫時關閉 selinux setenforce 0 # 永久關閉 vi /etc/sysconfig/selinux # 修改以下引數,設定為disable SELINUX=disabled
下面我們就需要使用nptdate來統一我們的系統時間和時區,伺服器時間與阿里雲伺服器對齊。
# 統一時區,為上海時區 ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime bash -c "echo 'Asia/Shanghai' > /etc/timezone" # 統一使用阿里伺服器進行時間更新 ntpdate ntp1.aliyun.com
下一步我們來安裝docker:
yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce -y systemctl start docker systemctl enable docker sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker.service
上面的:
- device-mapper-persistent-data: 儲存驅動,Linux上的許多高階卷管理技術
- lvm: 邏輯卷管理器,用於建立邏輯磁碟分割槽使用
然後,我們來安裝kubernetes元件,首先,切換阿里雲:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [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
然後,安裝kubernetes元件:
yum install -y kubelet kubeadm kubectl # 啟動kubelet systemctl enable kubelet && systemctl start kubelet
- kubelet 是 Kubernetes 中的核心元件。它會執行在叢集的所有節點上,並負責建立啟動服務容器
- kubectl 則是Kubernetes的命令列工具。可以用來管理,刪除,建立資源
- kubeadm 則是用來初始化叢集,子節點加入的工具
最後,我們需要設定一下bridge-nf-call-iptables:
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
安裝的部分就完成啦。下面我們來配置一些基本內容吧
二、基本配置
1)master節點安裝
之前說過,需要兩臺伺服器,一臺master,一臺node。我們先來安裝master伺服器的基本依賴。我們首先修改下主機名:
hostnamectl set-hostname master
然後我們來修改下master伺服器的host,使兩臺伺服器可以通訊:
ip addr vim /etc/hosts 172.31.178.169 master master
在上面的檔案中,把node伺服器的ip新增進去即可。然後我們需要配置下初始檔案:
kubeadm config print init-defaults > init-kubeadm.conf
vim init-kubeadm.conf
init-defaults命令,會生成一份初始檔案。下面我們需要在init-kubeadm.conf檔案中進行一些額外的,必要的更改:
- imageRepository: k8s.gcr.io 更換k8s映象倉庫 + imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers - localAPIEndpointc,advertiseAddress為master ip ,port預設不修改 localAPIEndpoint: + advertiseAddress: 172.31.178.169 # 此處為master的IP bindPort: 6443 # 配置子網路 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 + podSubnet: 10.244.0.0/16 # 新增這個
上面修改的程式碼修改了映象倉庫為阿里雲的,加速元件的拉取,替換ip為自己主機的ip,配置pod網路為flannel網段,後面為了讓叢集之間可以互相通訊,需要配置子網路,這些在後面的flannel網路中會用到。10.96.0.0/12 是Kubernetes內部的網路pods需要的網路。10.244.0.0/16 是Kubernetes內部services需要的網路。
下面我們就需要拉取一下元件:
// 檢視缺少的元件 kubeadm config images list --config init-kubeadm.conf // 拉取缺少的元件 kubeadm config images pull --config init-kubeadm.conf
直接執行這兩個命令,就可以檢視、拉取缺少的元件了。我們來簡單瞭解下,這些元件都是幹什麼的:
- kubeadm 可以用來拉取我們的預設元件映象
- kube-apiserver 提供介面服務,可以讓外網訪問叢集
- kube-controller-manager 內部的控制指令工具
- kube-scheduler 內部的任務排程器
- kube-proxy 反向代理和負載均衡,流量轉發
- pause 程式管理工具
- etcd 保持 叢集內部的資料一致性
- coredns 叢集內網通訊
我們也可以通過上圖,來理解下k8s的執行流程。下面我們來初始化k8s:
kubeadm init --config init-kubeadm.conf
然後,我們需要執行的命令內容,k8s做了一部分提示:
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 Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf 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 172.31.178.169:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:8aac19f4dbe68f1e15ba3d80e141acdc912e353f9757ad69187e8fb9780bc975
我們根據提示執行就好了。下面我們來安裝下flannel,flannel
主要的作用是通過建立一個虛擬網路,讓不同節點下的服務有著全域性唯一的IP地址,且服務之前可以互相訪問和連線。叢集內網網路通訊協議通訊模式採用了Flannel協議:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml docker pull quay.io/coreos/flannel:v0.13.0-rc2 kubectl apply -f kube-flannel.yml
下面我們要修改下net-conf.json檔案,把其中的Network網段,配置的跟之前的pod網段一樣即可:
{ "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } }
然後我們就可以通過下面的命令檢視下啟動情況:
kubectl get nodes
master節點的配置到這裡就基本oK了,下面我們來看下node節點的配置,首先同樣的,我們先修改下主機名:
hostnamectl set-hostname node1
然後將master節點的配置檔案拷貝到node節點:
scp $HOME/.kube/config root@172.31.178.170:~/
然後在node節點歸檔配置檔案:
mkdir -p $HOME/.kube sudo mv $HOME/config $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
然後,把node節點加入到master叢集內:
kubeadm join 172.16.81.164:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:b4a059eeffa2e52f2eea7a5d592be10c994c7715c17bda57bbc3757d4f13903d
如果剛才的命令丟失,可以在master機器上通過下面的命令重新生成一條命令:
kubeadm token create --print-join-command
同樣的,我們安裝下flannel:
scp ~/kube-flannel.yml root@172.31.178.170:~/ kubectl apply -f kube-flannel.yml
檢視下狀態:
kubectl get nodes
ok,到這裡,master節點和node節點的k8s基本配置就完事了,下面我們來安裝一些必要的伺服器軟體。
三、安裝其他服務
我們先來在master節點安裝下nginx:
kubectl create deployment nginx --image=nginx
然後:
kubectl expose deployment nginx --port=80 --type=NodePort
然後我們擴容幾個副本:
kubectl scale deployment nginx --replicas=3
nginx好了,下面我們配置下mysql,首先我們建立個mysql.yml檔案,新增如下內容:
apiVersion: v1 kind: ReplicationController metadata: name: mysql spec: replicas: 1 #Pod副本的期待數量 selector: app: mysql #符合目標的Pod擁有此標籤 template: #根據此模板建立Pod的副本(例項) metadata: labels: app: mysql #Pod副本擁有的標籤,對應RC的Selector spec: containers: #Pod內容器的定義部分 - name: mysql #容器的名稱 image: mysql #容器對應的Docker image ports: - containerPort: 3306 #容器應用監聽的埠號 env: #注入容器內的環境變數 - name: MYSQL_ROOT_PASSWORD value: "123456"
然後執行:
kubectl create -f mysql-rc.yaml
就建立好了mysql的配置。我們可以看下狀態:
kubectl get pods
kubectl describe pod mysql
基本的配置到這裡就OK了。我們下期見。