kubeadm快速搭建k8s集羣(kubernetes簡化安裝工具kubeadm)

目錄

1、環境準備

2、系統配置 

    2.1、設置主機名

    2.2、免密登錄

    2.3、安裝依賴包【3臺機器都執行】

    2.4、配置yum源【3臺機器都執行】

    2.5、關閉防火牆、selinux和swap【3臺機器都執行】

    2.6、配置內核參數【3臺機器都執行】

    2.7、執行清理和更新【3臺機器都執行】

3、安裝docker 

4、使用kubeadm部署k8s集羣

    4.1、安裝kubeadm、kubelet和kubectl

    4.2、配置kubeadm

    4.3、使用kubeadm配置master節點

    4.4、配置網絡

    4.5、驗證dns集羣是否可用【在master節點執行】

5、部署whoami 【在master節點執行】

6、安裝Weave Scope監控集羣


本文參考老師的文檔:E:\meWork\study\project\subject-3\subject-3-k8s\專題三-Kubernetes_學習文檔-N.docx

文檔中的“3.3.kubernetes 簡化安裝工具 kubeadm

注意事項:很多命令只有複製word原文檔的命令,粘貼、執行纔不會報錯,我從網頁、notepad++,上覆制粘貼、執行都報錯,可能是網頁、notepad++有什麼特殊的符號,centos不認識】,我重新安裝了3次才成功

kubeadm是Kubernetes的官方提供用於快速安裝Kubernetes集羣的工具。
Kubernetes文檔:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
官網參考資料:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
              https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/

1、環境準備

IP地址

節點角色

CPU

Memory

Hostname

192.168.0.35

master

>= 2c

>= 2G

Master

192.168. 0.36

worker

>= 2c

>= 2G

node1

192.168. 0.37

worker

>= 2c

>= 2G

Node2

至少需要2個CPU,否則在執行 “4.3 ”初始化master節點節點時,就會報錯

2、系統配置 

    2.1、設置主機名

1、設置主機名

192.168.0.35機器執行:hostnamectl set-hostname master

192.168.0.36機器執行:hostnamectl set-hostname node1

192.168.0.37機器執行:hostnamectl set-hostname node2

2、編輯/etc/hosts文件,添加域名解析【3臺機器都執行

cat <<EOF >>/etc/hosts
192.168.0.35 master
192.168.0.36 node1
192.168.0.37 node2
EOF

    2.2、免密登錄

設置master可以無密碼登錄所有節點的root賬戶

截圖參考的“3.2.2 K8S入門”中的“5.2、設置master可以無密碼登錄所有節點的root賬戶”:https://blog.csdn.net/pyl574069214/article/details/105594013#%E2%80%8B%C2%A0%C2%A0%20%C2%A0%205.2%E3%80%81%E8%AE%BE%E7%BD%AEmaster%E5%8F%AF%E4%BB%A5%E6%97%A0%E5%AF%86%E7%A0%81%E7%99%BB%E5%BD%95%E6%89%80%E6%9C%89%E8%8A%82%E7%82%B9%E7%9A%84root%E8%B4%A6%E6%88%B7

1、創建一個rsa的密鑰(一路按回車到最後):ssh-keygen -t rsa
2、將公鑰文件放到master的root賬戶下:ssh-copy-id root@master
3、將公鑰文件放到node1的root賬戶下:ssh-copy-id root@node1
4、將公鑰文件放到node2的root賬戶下:ssh-copy-id root@node2
5、在master節點上直接執行:ssh node1,就可以登錄到node1節點,如下圖:

    2.3、安裝依賴包3臺機器都執行

ipvs依賴 ipset;ntp保證各機器系統時間同步

安裝依賴包

yum install -y epel-release

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget

/usr/sbin/modprobe ip_vs

    2.4、配置yum源3臺機器都執行

1、配置阿里軟件源(base和epel):
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup #如果沒有epel-testing.repo,可以不執行此行
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2、配置國內Kubernetes源:

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

3、配置docker源:

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

 查看正在使用yum源:yum repolist

    2.5、關閉防火牆、selinux和swap3臺機器都執行

1、關閉防火牆,清理防火牆規則,設置默認轉發策略:
systemctl stop firewalld &&
systemctl disable firewalld &&
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat &&
iptables -P FORWARD ACCEPT

2、關閉SELinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

3、關閉swap分區

swapoff -a

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

    2.6、配置內核參數3臺機器都執行

1、由於ipvs已經在內核中,所以爲kube-proxy開啓ipvs的前提需要加載ip_vs_rr內核模塊
2、br_netfilter在執行此步驟之前,請確保已加載模塊
將橋接的IPv4流量傳遞到iptables的鏈,swappiness參數調整:
 

cat <<EOF >  /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward=1

net.ipv4.tcp_tw_recycle=0

vm.swappiness=0 # 禁止使用 swap 空間,只有當系統 OOM 時才允許使用它

vm.overcommit_memory=1 # 不檢查物理內存是否夠用

vm.panic_on_oom=0 # 開啓 OOM

EOF

modprobe ip_vs_rr

modprobe br_netfilter

sysctl --system

    2.7、執行清理和更新3臺機器都執行

(第一次需要比較久的時間):yum clean all&& yum makecache && yum update -y

3、安裝docker 

查看最新的docker版本:
yum list docker-ce.x86_64 --showduplicates | sort -r
yum list docker-ce-cli.x86_64 --showduplicates |sort -r

3臺機器都執行1、安裝docker:yum install -y docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
2、docker加入到開機啓動:systemctl enable docker && systemctl start docker
3、docker版本查看:docker version

配置一個docker加速【3臺機器都執行

1、創建或修改/etc/docker/daemon.json:

只有複製word原文檔的命令,粘貼、執行纔不會報錯,我從網頁、notepad++,上覆制粘貼、執行都報錯,可能是網頁、notepad++有什麼特殊的符號,centos不認識
## Create /etc/docker directory.
mkdir -p /etc/docker
# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
   "registry-mirrors": [
      "https://registry.docker-cn.com",
      "https://hub-mirror.c.163.com", 
      "https://docker.mirrors.ustc.edu.cn"
   ],
   "exec-opts": ["native.cgroupdriver=systemd"],
   "log-driver": "json-file",
   "log-opts": {
      "max-size": "100m",
      "max-file": "5"
   }
}
EOF
# Restart Docker
systemctl daemon-reload && systemctl restart docker

如果裝錯了

1、卸載舊版本:yum remove docker docker-common docker-selinux docker-engine

2、刪除daemon.json文件:rm -f /etc/docker/daemon.json

3、查詢docker安裝過的包:yum list installed | grep docker

4、刪除安裝包:yum remove docker-ce.x86_64 docker-ce-cli.x86_64

5、刪除容器:rm -rf /var/lib/docker

直接啓動docker(如果啓動失敗,可以直接看到錯誤信息):dockerd

2、可以通過docker info查看是否配置成功

確認一下iptables filter表中FOWARD鏈的默認策略(pllicy)爲ACCEPT:iptables -nvL

如果不是,再執行一下“關閉防火牆,清理防火牆規則,設置默認轉發策略”的命令。

4、使用kubeadm部署k8s集羣

    4.1、安裝kubeadm、kubelet和kubectl

3臺機器都需要安裝】如下3個軟件包

Kubelet:負責與其他節點集羣通信,並進行本節點Pod和容器生命週期的管理。
Kubeadm:是Kubernetes的自動化部署工具,降低了部署難度,提高效率。
Kubectl:是Kubernetes集羣管理工具

1、查看可用版本:
yum list --showduplicates | grep 'kubeadm\|kubectl\|kubelet'
2、安裝 kubeadm1.15.0, kubelet1.15.0 和 kubectl1.15.0【3臺機器都執行
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0 --disableexcludes=kubernetes
3、先設置開機啓動(此時還不能啓動 kubelet)3臺機器都執行
systemctl enable --now kubelet

從安裝結果可以看出還安裝了cri-tools, kubernetes-cni, socat三個依賴:
    1、socat是kubelet的依賴
    2、cri-tools是CRI(Container Runtime Interface)容器運行時接口的命令行工具

    4.2、配置kubeadm

查看kubelet安裝了哪些文件:rpm -ql kubelet

修改/etc/sysconfig/kubelet3臺機器都執行

sed -i "s/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS=\"--fail-swap-on=false\"/" /etc/sysconfig/kubelet
cat /etc/sysconfig/kubelet

在master節點執行即可

1、創建並修改配置:
# 導出配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

2、修改kubeadm.yml如下內容

vim kubeadm.yml

#1、修改爲主節點IP【找到advertiseAddress】
advertiseAddress: 192.168.0.35
#2、【找到controllerManager】在前面加入一行
controlPlaneEndpoint: ""
#3、國內不能訪問Google,修改爲阿里雲【找到imageRepository】
imageRepository: registry.aliyuncs.com/google_containers
#4、修改版本號【找到kubernetesVersion】
kubernetesVersion: v1.15.0
#5、配置成Flannel的默認網段【找到dnsDomain】在dnsDomain後面加入一行
podSubnet: "10.244.0.0/16"
#6、末尾加入如下行
---
# 開啓 IPVS 模式

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
  mode: ipvs

少了中劃線。就會報如下錯誤:

 3、查看和拉取鏡像

# 查看所需鏡像列表
kubeadm config images list --config kubeadm.yml
# 拉取鏡像【3臺機器都執行】【需要先將kubeadm.yml文件複製到其他機器,其他機器才能執行拉取鏡像
kubeadm config images pull --config kubeadm.yml

如果一個都沒有拉取到,可能是配置daemon.json文件中的加速器沒生效,可以用docker info查看一下

4、將kubeadm.yml文件複製到其他機器【在master節點執行

將kubeadm.yml文件複製到node1的/root目錄下:scp kubeadm.yml root@node1:/root

將kubeadm.yml文件複製到node2的/root目錄下:scp kubeadm.yml root@node2:/root

    4.3、使用kubeadm配置master節點

1、中途失敗或是想修改配置可以使用kubeadm reset命令重置配置,再做初始化操作即可。

2、如果slave節點加入master時配置有問題可以在slave節點上使用kubeadm reset重置配置再使用kubeadm join命令重新加入即可。希望在master節點刪除node,可以使用kubeadm delete nodes <NAME> 刪除

1、初始化master節點在master節點執行kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

2、配置kubectl:命令在“初始化master節點”輸出結果中

3、在工作節點執行加入集羣命令:命令在“初始化master節點”輸出結果中

4、驗證是否成功:kubectl get node

如果報錯:[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`

是因爲:“2.6配置內核參數”沒有成功,將2.6的命令再執行一次。

請備份好 kubeadm init 輸出中的 kubeadm join 命令,因爲您會需要這個命令來給集羣添加節點。
如果忘記了Master的Token,可以在Master上輸入以下命令查看:kubeadm token list
默認情況下Token過期是時間是24小時,如果Token過期以後,可以輸入以下命令,生成新的Token
kubeadm token create
--discovery-token-ca-cert-hash的查看方法,在Master運行以下命令查看
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

初始化master節點kubeadm init執行過程說明:

    init:指定版本進行初始化操作
    preflight:初始化前的檢查和下載所需要的 Docker 鏡像文件
    kubelet-start:生成 kubelet 的配置文件 var/lib/kubelet/config.yaml,沒有這個文件 kubelet 無法啓動,所以初始化之前的                                 kubelet 實際上啓動不會成功
    certificates:生成 Kubernetes 使用的證書,存放在 /etc/kubernetes/pki 目錄中
    kubeconfig:生成 KubeConfig 文件,存放在 /etc/kubernetes 目錄中,組件之間通信需要使用對應文件
    control-plane:使用 /etc/kubernetes/manifest 目錄下的 YAML 文件,安裝 Master 組件
    etcd:使用 /etc/kubernetes/manifest/etcd.yaml 安裝 Etcd 服務
    wait-control-plane:等待 control-plan 部署的 Master 組件啓動
    apiclient:檢查 Master 組件服務狀態。
    uploadconfig:更新配置
    kubelet:使用 configMap 配置 kubelet
    patchnode:更新 CNI 信息到 Node 上,通過註釋的方式記錄
    mark-control-plane:爲當前節點打標籤,打了角色 Master,和不可調度標籤,這樣默認就不會使用 Master 節點來運行 Pod
    bootstrap-token:生成 token 記錄下來,後邊使用 kubeadm join 往集羣中添加節點時會用到
    addons:安裝附加組件 CoreDNS 和 kube-proxy

在master節點驗證worker節點是否成功:kubectl get cs,nodes

確認每個組件都處於healthy狀態

    4.4、配置網絡

1、查看pod狀態

kubectl get pod -n kube-system -o wide

可以看出coredns尚未運行,此時我們還需要安裝網絡插件。

2、安裝flannel network add-on

   1、下載kube-flannel.yml文件:curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    我這裏下載不了,直接用的老師給的kube-flannel.yml文件

   2、編輯kube-flannel.yml內容
    

   3、應用kube-flannel.yml配置創建服務: kubectl apply -f  kube-flannel.yml

   4、監控Pod的狀態:watch kubectl get pod --all-namespaces -o wide
    

如果有的status不是Running,就需要排查問題

1、查看pod情況:kubectl get pod -n kube-system

2、查看某一個pod報錯的詳情
    比如查看kube-flannel-ds-amd64-bjvqx報錯的詳情:kubectl describe pod kube-flannel-ds-amd64-bjvqx -n kube-system

如果是上圖中的錯誤信息,就手動拉取鏡像:docker pull quay.io/coreos/flannel:v0.12.0-amd64

然後通過docker images查看是否已經將flannel鏡像拉取下來;【我這裏反正是沒有成功,後來我就將虛擬機刪除,從安裝,就好了,可能是中間那個命令沒執行對

    4.5、驗證dns集羣是否可用在master節點執行

1、新建一個deployment

cd /opt/k8s/work
cat > my-nginx.yaml <<EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
EOF

kubectl create -f my-nginx.yaml

2、查看副本:kubectl get deploy

3、生成nginx服務:kubectl expose deploy my-nginx

4、查看nginx服務是否創建成功:kubectl get services --all-namespaces |grep my-nginx

5、創建另一個Pod,查看/etc/resolv.conf是否包含 kubelet 配置的--cluster-dns和--cluster-domain,是否能夠將服務my-nginx解析到上面顯示的Cluster IP 10.107.5.77

cd /opt/k8s/work
cat > dnsutils-ds.yml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: dnsutils-ds
  labels:
    app: dnsutils-ds
spec:
  type: NodePort
  selector:
    app: dnsutils-ds
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: dnsutils-ds
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  template:
    metadata:
      labels:
        app: dnsutils-ds
    spec:
      containers:
      - name: my-dnsutils
        image: tutum/dnsutils:latest
        command:
          - sleep
          - "3600"
        ports:
        - containerPort: 80
EOF

kubectl create -f dnsutils-ds.yml

6、查看服務:kubectl get service

刪除服務:如下圖

刪除服務後,設置master節點,也可以安排pod 

7、# 所有主服務器都安排 pod

kubectl taint nodes --all node-role.kubernetes.io/master-

5、部署whoami 在master節點執行

1、在Master運行部署Whoami
kubectl create deployment whoami --image=idoall/whoami

 2、查看Whoami部署狀態
kubectl get deployments
3、查看Whoami的部署信息
kubectl describe deployment whoami
4、查看Whoami的pod信息
kubectl describe po whoami
5、爲Whoami擴展端口;創建一個可以通過互聯網訪問的Whoami容器
kubectl create service nodeport whoami --tcp=80:80
6、查看當前的服務狀態
kubectl get svc,pods -o wide
7、測試Whoami服務是否運行正常【端口是6查出的服務端口】
curl node1:31796
8、刪除Whoami部署
kubectl delete deployment whoami
kubectl delete service whoami

6、安裝Weave Scope監控集羣

1、安裝Scope:kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')&k8s-service-type=NodePort"
2、查看命名空間是否創建成功:kubectl get namespace
3、查看weave的service、deployments、pods:kubectl get service,deployments,pods -o wide -n weave

在瀏覽器輸入IP加上圖service/weave-scope-app的端口:192.168.0.35:30630,就可以看到監控界面了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章