hyper-v虛擬機上的centos多節點k8s集群實踐


之前體驗了minikube,掉深坑里至今還沒有爬出來,玩單節點用minikube夠了,

但傻瓜試的安裝讓人對k8s理解不是很深刻(坑),而且多節點好像有什么奇怪的問題

所以我這次要用兩個虛擬機來模擬k8s集群   一主節點一工作節點

hostname      ipaddr   cpu   硬盤  內存  OS    docker  k8s

m1    1921.168.1.200  2    20G   2G    centos7  18    1.16.2

w1    1921.168.1.201  2    20G   2G    centos7  18    1.16.2

由於我使用的虛擬機驅動是hyper-v  所以要記得每個虛擬機關閉動態內存  關於虛擬機的安裝配置這里就不再深入討論

虛擬機交換機

 

動態內存關閉

 

 

 

我先創建一個虛擬機,安裝完docker,k8s和一些其他配置后,再復制,這樣比較快一點

但是k8s集群里的節點  mac和uuid不能重復,這個到時再想辦法修改

安裝centos時選擇最小安裝,圖形界面不安裝,這樣比較省計算機資源

最小安裝完成重啟后,  需要做的事情 1.修改網卡為開機自動啟動,2.打開ssh 

先來打開ssh吧,  hyper-v里面操作不方便 我要用powersheel連接上去

vi /etc/ssh/sshd_config  

 取消兩行注,由於我是用root登錄,所以要將permitrootlogin設置成yes

 

 

 

重啟服務 

service sshd restart

 

接下來把網卡設置成開機自啟,因為現在網卡是沒有啟動的

先ip addr 查一下網卡名稱  然后進入到 /etc/sysconfig/network-scripts/目錄  ls|grep 網卡名稱

 

 

 

 

原來的配置為 動態獲取ip,不開機自動啟動

 

 

 修改成,開機自動啟動, 靜態ip

 

 修改hosts文件

vi /etc/hosts

在后面加上兩個節點的host

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.200 m1
192.168.1.201 w1

 

 保存后

reboot 指令重啟

管理員權限打開powershell    輸入ssh root@192.168.1.200連接

如果出現

 

 

 

到用戶目錄/.ssh/known_hosts 編輯刪除現有ip的那一行重連即可

連上來后,先更新yum

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

 

再設置docker倉儲

yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo

 

然后安裝18版本的docker,安裝太高k8s用不了

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

 

安裝完成后 設置啟動docker並設置開機啟動

systemctl start docker && systemctl enable docker

接下來設置docker 的鏡像源, 否則將被牆

[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://自己去注冊自己的不懂百度.mirror.aliyuncs.com"]
> }
> EOF

把daemon.json 改名為daemon.conf

mv /etc/docker/daemon.json  /etc/docker/daemon.conf

 

設置好重啟一下docker

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker

 

最后設置k8s相關的配置 先設置hostname 為主節點 m1 (master node

[root@localhost ~]# hostnamectl set-hostname m1

重新登錄一下驗證是否修改成功

[root@localhost ~]# exit
logout
Connection to 192.168.1.200 closed.
PS C:\WINDOWS\system32> ssh root@192.168.1.200
root@192.168.1.200's password:
Last login: Mon Nov  4 20:42:51 2019 from 192.168.1.104
[root@m1 ~]#

關防火牆

[root@m1 ~]# systemctl stop firewalld
[root@m1 ~]# systemctl disable firewalld

 

禁用swap

[root@m1 ~]# swapoff -a
[root@m1 ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab

修改網橋模式

[root@m1 ~]# sysctl net.bridge.bridge-nf-call-iptables=1
[root@m1 ~]# sysctl net.bridge.bridge-nf-call-ip6tables=1
[root@m1 ~]# cat <<EOF >  /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
[root@m1
~]# sysctl -p /etc/sysctl.d/k8s.conf

給yum 加kubernetes 阿里雲 鏡像源

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

更新yum緩存

yum clean all
yum -y makecache

 

安裝 kubeadm kubelet kubectl

  • kubelet 運行在集群所有節點上,用於啟動Pod和容器等對象的工具
  • kubeadm 用於初始化集群,啟動集群的命令工具
  • kubectl 用於和集群通信的命令行,通過kubectl可以部署和管理應用,查看各種資源,創建、刪除和更新各種組件
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2

啟動kubelet 並設置開機自動啟動

[root@m1 ~]# systemctl enable kubelet && systemctl start kubelet

創建下載kubernetes鏡像緩存腳本 ,並啟動它下載

 vi image.sh 
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.16.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done

發現沒有權限

[root@m1 ~]# ./image.sh
-bash: ./image.sh: Permission denied

給權限后重新執行腳本 

chmod 777 image.sh

./image.sh

 

結束后查看一下docker 的鏡像

[root@m1 ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.16.2             8454cbe08dc9        2 weeks ago         86.1MB
k8s.gcr.io/kube-apiserver            v1.16.2             c2c9a0406787        2 weeks ago         217MB
k8s.gcr.io/kube-controller-manager   v1.16.2             6e4bffa46d70        2 weeks ago         163MB
k8s.gcr.io/kube-scheduler            v1.16.2             ebac1ae204a2        2 weeks ago         87.3MB
k8s.gcr.io/coredns                   1.3.1               eb516548c180        9 months ago        40.3MB
k8s.gcr.io/etcd                      3.3.10              2c4adeb21b4f        11 months ago       258MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        22 months ago       742kB

說明下載正常

 

,接下來我要將這個虛擬機備份一下, 將來之前做的那些工作都可以用還原的方式略過了

 

 

然后我刪除了虛擬機k8s-m1,因為我要重新規划保存的位置

把剛才導出的虛擬機導入

 

 

 再導入一次,為工作節點

 

 接下來把剛才導入的兩個虛擬機再次刪除,我們要的只是他硬盤里的數據,  否則 product_uuid會重復,所以我們要多做幾步操作

 

 

 

 添加 新的虛擬機,選擇硬盤為剛才導入時選擇的硬盤, 前面內存那里記得不要選動態內存,如法炮制 k8s-w1

 

這時兩個虛擬機的靜態ip是沖突的,我們啟動第二台修改ip地址為192.168.1.201

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

hostname也修改成w1

hostnamectl set-hostname w1

修改好后reboot重啟  順便把k8s-m1也啟動

刪除C:\Users\hbb\.sshknown_hosts 后開兩個管理員權限的ps 連接上m1 和w1

 

接下來我們兩邊都修改hosts文件,加入 我們規划好的ip 的別名

vi /etc/hosts

 

查看mac 和uuid是否沖突

cat /sys/class/net/eth0/address
cat /sys/class/dmi/id/product_uuid

 

 都沒有沖突了

 接下來做主節點m1的配置,下面的操作只需要在m1上執行

kubeadm init --apiserver-advertise-address 192.168.1.200 --pod-network-cidr=192.168.0.0/16

自動補全

[root@m1 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@m1 ~]# source .bash_profile

安裝網絡策略,

kubectl create -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

 

默認情況下  master上不能安裝pod,因為主節點上打上了污點

如果要在master上安裝pod,則要把污點去掉

查看污點

[root@m1 ~]# kubectl describe node m1|grep -i taints
Taints: node-role.kubernetes.io/master:NoSchedule

刪除默認的污點

[root@m1 ~]#  kubectl taint nodes m1 node-role.kubernetes.io/master-
node/m1 untainted

打污點的語法有興趣可以自己去研究,這里不再介紹太多

接下來就是工作節點 w1了

在我剛把m1 kubeinit時產生了一個 命令,可以復制去子節點上執行以加入 主節點

也可以手動創建 

kubeadm token create --print-join-command

 

 

復制去工作節點上執行就可以直接加入主節點

工作節點執行效果如下

 

 

 主節點查看node service pod compoent

[root@m1 ~]# kubectl get node
NAME   STATUS   ROLES    AGE   VERSION
m1     Ready    master   18m   v1.16.2
w1     Ready    <none>   11m   v1.16.2
[root@m1 ~]# kubectl get svc --all-namespaces
NAMESPACE     NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  18m
kube-system   kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   18m
[root@m1 ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-dc6cb64cb-856pv   1/1     Running   0          15m
kube-system   calico-node-k259l                         1/1     Running   0          12m
kube-system   calico-node-z5wbs                         1/1     Running   0          15m
kube-system   coredns-5644d7b6d9-v8wjh                  1/1     Running   0          19m
kube-system   coredns-5644d7b6d9-z2zsw                  1/1     Running   0          19m
kube-system   etcd-m1                                   1/1     Running   0          18m
kube-system   kube-apiserver-m1                         1/1     Running   0          18m
kube-system   kube-controller-manager-m1                1/1     Running   0          18m
kube-system   kube-proxy-b882q                          1/1     Running   0          12m
kube-system   kube-proxy-vxfxj                          1/1     Running   0          19m
kube-system   kube-scheduler-m1                         1/1     Running   0          17m

 [root@m1 ~]# kubectl get cs -o json

 

接下來可以加入一些pod 測試 ,加入pod的方式有兩種

使用yaml文件安裝/卸載  -f后面接一個yaml文件,可以是網絡路徑

kubectl create -f kubernetes-dashboard.yaml 
kubectl delete-f kubernetes-dashboard.yaml 

 

一種是直接使用鏡像,直接使用鏡像比較少見

本人也還沒有研究,可以參考這個地方

http://docs.kubernetes.org.cn/618.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM