二進(jìn)制搭建K8S集群-1.[服務(wù)組件部署]

集群規(guī)劃:
2臺(tái)master(高可用) | 2臺(tái)node (配置方面node要跑應(yīng)用所以盡量配置高一點(diǎn),master比node低一點(diǎn))
因?yàn)閷?shí)驗(yàn)環(huán)境直接啟4個(gè)虛擬機(jī)吃不消,所以先搭建1臺(tái)master,2臺(tái)node,等后期在添加1臺(tái)master擴(kuò)容為高可用架構(gòu)。

image.png

K8S架構(gòu):


image.png

一-系統(tǒng)初始化設(shè)置

master執(zhí)行

1.在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.222 k8s-master1
192.168.1.111 k8s-node1
192.168.1.112 k8s-node2
EOF
2.關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld

3.關(guān)閉selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 臨時(shí)

4.關(guān)閉swap
swapoff -a  # 臨時(shí)
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

5.根據(jù)規(guī)劃設(shè)置主機(jī)名
hostnamectl set-hostname <hostname>

6. 將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

7. 時(shí)間同步
yum install ntpdate -y
ntpdate time.windows.com

剩下的node節(jié)點(diǎn)機(jī)器,除了第一步以外,都執(zhí)行相同的操作。(node節(jié)點(diǎn)很多的情況下推薦ansible)

ansible方法:

ansible -hosts文件

[node]
192.168.1.111  name=k8s-node1
192.168.1.112  name=k8s-node2

playbook.yml

---
- hosts: node
  gather_facts: no
  tasks:
    - name: 關(guān)閉防火墻
      systemd: name=firewalld state=stopped enabled=no
    - name: 關(guān)閉sellinux
      shell: sed -i 's/enforcing/disabled/' /etc/selinux/config
    - name: 關(guān)閉swp
      shell: sed -ri 's/.*swap.*/#&/' /etc/fstab
    - name:  時(shí)間同步
      yum: name=ntpdate state=installed
    - name: 執(zhí)行時(shí)間同步
      shell: ntpdate time.windows.com
    - name: 拷貝修改參數(shù)腳本
      copy: src=edit_sysctl.sh dest=/root/
    - name: 運(yùn)行腳本
      shell: sh /root/edit_sysctl.sh
    - name: 設(shè)置主機(jī)名
      tags: hostname
      shell: hostnamectl set-hostname {{ name }}
      #{{ name }}為ansible內(nèi)置變量,vaule代表hosts定義主機(jī)的name 變量的值

edit_sysctl.sh腳本

#!/bin/bash
# 將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

二-搭建ECTD集群

Etcd 是一個(gè)分布式鍵值存儲(chǔ)系統(tǒng),Kubernetes使用Etcd進(jìn)行數(shù)據(jù)存儲(chǔ),所以先準(zhǔn)備一個(gè)Etcd數(shù)據(jù)庫,為解決Etcd單點(diǎn)故障,應(yīng)采用集群方式部署,這里使用3臺(tái)組建集群,可容忍1臺(tái)機(jī)器故障.
注意:ectd 為了節(jié)省機(jī)器,這里與K8s節(jié)點(diǎn)機(jī)器復(fù)用。也可以獨(dú)立于k8s集群之外部署,只要apiserver能連接到就行。


image.png
1.準(zhǔn)備cfssl證書生成工具

這里是在k8s-master上執(zhí)行的

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
2.生成etcd證書

2-1.自簽證書頒發(fā)機(jī)構(gòu)(CA)
創(chuàng)建工作目錄

mkdir -p ~/TLS/{etcd,k8s}

cd TLS/etcd

自簽一個(gè)CA:

cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

cat > ca-csr.json << EOF
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
         }
       ]
}
EOF

生成證書:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

#ls *pem
#ca-key.pem  ca.pem

2-2.使用自簽好的CA簽發(fā)ETCD HTTPS證書
創(chuàng)建證書申請文件

cat > server-csr.json << EOF
{
    "CN": "etcd",
    "hosts": [
    "192.168.1.222",
    "192.168.1.111",
    "192.168.1.112",
"192.168.1.113"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

注意:hosts那里可以理解為可信任的etcd IP,etcd集群所有etcd都要加進(jìn)去,為了擴(kuò)容方便我們還可以多加幾個(gè)預(yù)留IP。

生成證書:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

#ls server*pem
#server-key.pem  server.pem
  1. 從Github下載ETCD二進(jìn)制文件
    https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
4.部署etcd集群

先部署一個(gè)節(jié)點(diǎn),在把整個(gè)etcd程序目錄和系統(tǒng)system配置文件拷貝到其他節(jié)點(diǎn) ,節(jié)省時(shí)間。這里先操作master

4-1. 創(chuàng)建工作目錄,解壓二進(jìn)制包--etcd/bin

mkdir -p /root/k8s/etcd{bin,cfg,ssl}
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /root/k8s/etcd/bin/   #現(xiàn)將啟動(dòng)程序挪過去

4-2.創(chuàng)建etcd配置文件 ---etcd/cfg

cat > /root/k8s/etcd/cfg/etcd.conf << EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.1.222:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.222:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.222:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.222:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.1.222:2380,etcd-2=https://192.168.1.111:2380,etcd-3=https://192.168.1.112:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

說明:

  • ETCD_NAME:節(jié)點(diǎn)名稱,集群中唯一
  • ETCD_DATA_DIR:數(shù)據(jù)目錄
  • ETCD_LISTEN_PEER_URLS:集群通信監(jiān)聽地址
  • ETCD_LISTEN_CLIENT_URLS:客戶端訪問監(jiān)聽地址
  • ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址
  • ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址
  • ETCD_INITIAL_CLUSTER:集群節(jié)點(diǎn)地址
  • ETCD_INITIAL_CLUSTER_TOKEN:集群Token
  • ETCD_INITIAL_CLUSTER_STATE:加入集群的當(dāng)前狀態(tài),new是新集群,existing表示加入已有集群

4-3. 將開始生成的etcd證書拷貝過來 --etcd/ssl

cp /root/TLS/etcd/ca*pem   /root/TLS/etcd/server*pem   /root/k8s/etcd/ssl/

4-4.將etcd配置成system系統(tǒng)服務(wù)

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/root/k8s/etcd/cfg/etcd.conf
ExecStart=/root/k8s/etcd/bin/etcd \
        --name=${ETCD_NAME} \
        --data-dir=${ETCD_DATA_DIR} \
        --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
        --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
        --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
        --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
        --initial-cluster=${ETCD_INITIAL_CLUSTER} \
        --initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
        --initial-cluster-state=new \
        --cert-file=/root/k8s/etcd/ssl/server.pem \
        --key-file=/root/k8s/etcd/ssl/server-key.pem \
        --peer-cert-file=/root/k8s/etcd/ssl/server.pem \
        --peer-key-file=/root/k8s/etcd/ssl/server-key.pem \
        --trusted-ca-file=/root/k8s/etcd/ssl/ca.pem \
        --peer-trusted-ca-file=/root/k8s/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

4-5. 啟動(dòng)并設(shè)置開機(jī)啟動(dòng)

systemctl daemon-reload
systemctl start etcd
systemctl enable etcd

注意:直接啟動(dòng)第一個(gè)節(jié)點(diǎn)上的etcd會(huì)卡著不動(dòng),這是因?yàn)槠渌?jié)點(diǎn)還沒啟動(dòng),他在等待鏈接,超時(shí)狀態(tài)。
如果啟動(dòng)失敗,直接查看日志/var/log/message 或 journalctl -u etcd

4-6. 將etcd程序文件目錄和sys管理配置文件拷貝到其他etcd節(jié)點(diǎn),并修該etcd.conf 為各自的IP
機(jī)器數(shù)量多可以用ansbile

---
- hosts: node
  gather_facts: no
  tasks:
    - name: 為etcd節(jié)點(diǎn)創(chuàng)建工作目錄
      file: name=/root/k8s state=directory

    - name: 拷貝etcd程序目錄
      copy: src=/root/k8s/etcd dest=/root/k8s/

    - name: 拷貝system文件
      tags: sys
      copy: src=/usr/lib/systemd/system/etcd.service dest=/usr/lib/systemd/system/

修改etcd.conf(所有node都要改為自己的IP,ETCD_NAME)


image.png

最后同上一樣,啟動(dòng)服務(wù)。

systemctl daemon-reload
systemctl start etcd
systemctl enable etcd

4.7-查看etcd集群狀態(tài)(寫成了sh,方便查看)

#!/bin/bash
WORKDIR=/root/k8s
server_1=192.168.1.222
server_2=192.168.1.111
server_3=192.168.1.112
ETCDCTL_API=3 $WORKDIR/etcd/bin/etcdctl --cacert=$WORKDIR/etcd/ssl/ca.pem --cert=$WORKDIR/etcd/ssl/server.pem --key=$WORKDIR/etcd/ssl/server-key.pem --endpoints="https://${server_1}:2379,https://${server_2}:2379,https://${server_3}:2379" endpoint health

etcd集群啟動(dòng)成功,搭建完成。


image.png

三. 安裝Docker

各個(gè)節(jié)點(diǎn)安裝docker,這里直接yum裝就可以

yum install -y yum-utils
#阿里云鏡像倉庫
yum-config-manager \
  --add-repo \
   http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum軟件包索引
yum makecache fase 
#安裝docker
yum install docker-ce 
#配置阿里鏡像加速器
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
#啟動(dòng)docker
systemctl start docker 

四. 部署Master Node

1.生成kube-apiserver證書

1-1.自簽證書頒發(fā)機(jī)構(gòu)(CA)

切換到開始創(chuàng)建的TLS目錄下,cd /root/TLS/k8s

cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
cat > ca-csr.json << EOF
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF
生成證書:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

#ls *pem
#ca-key.pem  ca.pem
1-2.使用自簽CA簽發(fā)kube-apiserver HTTPS證書

創(chuàng)建證書申請文件
注意:hosts字段仍然代表可信任的主機(jī)列表,這里要寫所有Master、LB/VIP IP ,一個(gè)都不能少,方便后期擴(kuò)容建議多寫幾個(gè)預(yù)留IP,在部署前期一定要將IP 以及角色都規(guī)劃好。(222,252為master ip,188,199為預(yù)留VIP ip)

cat > server-csr.json << EOF
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "192.168.1.222",
      "192.168.1.252",
      "192.168.1.188",
      "192.168.1.199",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

生成證書:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

#ls server*pem
#server-key.pem  server.pem
2.下載并解壓二進(jìn)包

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183
注意:打開鏈接你會(huì)發(fā)現(xiàn)里面有很多包,下載一個(gè)server包就夠了,包含了Master和Worker Node二進(jìn)制文件。

mkdir -p /root/k8s/kubernetes/{bin,cfg,ssl,logs} 
tar zxvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin
cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin
cp kubectl /usr/bin/

3.部署kube-apiserver

3-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-apiserver.conf << EOF
KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/root/k8s/kubernetes/logs \
--etcd-servers=https://192.168.1.222:2379,https://192.168.1.111:2379,https://192.168.1.112:2379 \
--bind-address=192.168.1.222 \
--secure-port=6443 \
--advertise-address=192.168.1.222 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth=true \
--token-auth-file=/root/k8s/kubernetes/cfg/token.csv \
--service-node-port-range=30000-32767 \
--kubelet-client-certificate=/root/k8s/kubernetes/ssl/server.pem \
--kubelet-client-key=/root/k8s/kubernetes/ssl/server-key.pem \
--tls-cert-file=/root/k8s/kubernetes/ssl/server.pem  \
--tls-private-key-file=/root/k8s/kubernetes/ssl/server-key.pem \
--client-ca-file=/root/k8s/kubernetes/ssl/ca.pem \
--service-account-key-file=/root/k8s/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/root/k8s/etcd/ssl/ca.pem \
--etcd-certfile=/root/k8s/etcd/ssl/server.pem \
--etcd-keyfile=/root/k8s/etcd/ssl/server-key.pem \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/root/k8s/kubernetes/logs/k8s-audit.log"

注:上面兩個(gè)\ \ 第一個(gè)是轉(zhuǎn)義符,第二個(gè)是換行符,使用轉(zhuǎn)義符是為了使用EOF保留換行符。

#配置文件解釋
--logtostderr:啟用日志
--v:日志等級(jí)
--log-dir:日志目錄
--etcd-servers:etcd集群地址
--bind-address:監(jiān)聽地址
--secure-port:https安全端口
--advertise-address:集群通告地址
--allow-privileged:啟用授權(quán)
--service-cluster-ip-range:Service虛擬IP地址段
--enable-admission-plugins:準(zhǔn)入控制模塊
--authorization-mode:認(rèn)證授權(quán),啟用RBAC授權(quán)和節(jié)點(diǎn)自管理
--enable-bootstrap-token-auth:啟用TLS bootstrap機(jī)制
--token-auth-file:bootstrap token文件
--service-node-port-range:Service nodeport類型默認(rèn)分配端口范圍
--kubelet-client-xxx:apiserver訪問kubelet客戶端證書
--tls-xxx-file:apiserver https證書
--etcd-xxxfile:連接Etcd集群證書
--audit-log-xxx:審計(jì)日志
3-2.將前面生成的在TSL/k8s下生成的證書拷貝到配置文件路徑
cp /root/TLS/k8s/server*pem  /root/TLS/k8s/ca*pem  /root/k8s/kubernetes/ssl/
3-3. 啟動(dòng)TLS Bootstrapping 機(jī)制

說明: TLS Bootstraping:Master apiserver啟用TLS認(rèn)證后,Node節(jié)點(diǎn)kubelet和kube-proxy要與kube-apiserver進(jìn)行通信,必須使用CA簽發(fā)的有效證書才可以,當(dāng)Node節(jié)點(diǎn)很多時(shí),這種客戶端證書頒發(fā)需要大量工作,同樣也會(huì)增加集群擴(kuò)展復(fù)雜度。為了簡化流程,Kubernetes引入了TLS bootstraping機(jī)制來自動(dòng)頒發(fā)客戶端證書,kubelet會(huì)以一個(gè)低權(quán)限用戶自動(dòng)向apiserver申請證書,kubelet的證書由apiserver動(dòng)態(tài)簽署。所以強(qiáng)烈建議在Node上使用這種方式,目前主要用于kubelet,kube-proxy還是由我們統(tǒng)一頒發(fā)一個(gè)證書。

創(chuàng)建上述配置文件中token文件:
#生成token
head -c 16 /dev/urandom | od -An -t x | tr -d ' '
#創(chuàng)建token文件
cat > /root/k8s/kubernetes/cfg/token.csv << EOF
54c2956999675c60a4d8fd821d68edee,kubelet-bootstrap,10001,"system:node-bootstrapper"
EOF
#授權(quán)kubelet-bootstrap用戶允許請求證書
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
3-4. 將apiserver加入system系統(tǒng)服務(wù)管理, 啟動(dòng)服務(wù)
cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-apiserver.conf
ExecStart=/root/k8s/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-apiserver
systemctl enable kube-apiserver
image.png

4.部署kube-controller-manager

4-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-controller-manager.conf << EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/root/k8s/kubernetes/logs \
--leader-elect=true \
--master=127.0.0.1:8080 \
--bind-address=127.0.0.1 \
--allocate-node-cidrs=true \
--cluster-cidr=10.244.0.0/16 \
--service-cluster-ip-range=10.0.0.0/24 \
--cluster-signing-cert-file=/root/k8s/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/root/k8s/kubernetes/ssl/ca-key.pem  \
--root-ca-file=/root/k8s/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/root/k8s/kubernetes/ssl/ca-key.pem \
--experimental-cluster-signing-duration=87600h0m0s"
EOF

–master:通過本地非安全本地端口8080連接apiserver。
–leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)
–cluster-signing-cert-file/–cluster-signing-key-file:自動(dòng)為kubelet頒發(fā)證書的CA,與apiserver保持一致

4-2. 將kube-controller-manager加入系統(tǒng)服務(wù), 啟動(dòng)服務(wù)
cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-controller-manager.conf
ExecStart=/root/k8s/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-controller-manager
systemctl enable kube-controller-manager
image.png

5. 部署kube-scheduler

5-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-scheduler.conf << EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/roo/k8s/kubernetes/logs \
--leader-elect \
--master=127.0.0.1:8080 \
--bind-address=127.0.0.1"
EOF

--master:通過本地非安全本地端口8080連接apiserver。
--leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)

5-2.將scheduler加入到系統(tǒng)服務(wù),啟動(dòng)服務(wù)
cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-scheduler.conf
ExecStart=/root/k8s/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-scheduler
systemctl enable kube-scheduler
image.png

6.查詢集群狀態(tài)

到此,Master Node上的組件全部部署完了,讓我們看下集群的狀態(tài)

kubectl get cs
image.png

五. 部署Worker Node

這里還是在master node 操作,222這臺(tái)機(jī)器即作為master又作為node, 后面部署其他節(jié)點(diǎn)worker node思路跟前面etcd類似,都是將一臺(tái)部署好,另外的將文件復(fù)制過去改改配置文件

1. 創(chuàng)建工作目錄并拷貝二進(jìn)制文件

在所有worker node執(zhí)行 (這里master這臺(tái)已經(jīng)執(zhí)行過了,111,112 執(zhí)行)

mkdir -p /root/k8s/kubernetes/{bin,cfg,ssl,logs} 

從master節(jié)點(diǎn)拷貝到worker節(jié)點(diǎn):

cd /root/k8s/kubernetes/server/bin
cp kubelet kube-proxy  /root/k8s/kubernetes/bin/ #本地拷貝

2.部署kubelet

2-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kubelet.conf << EOF
KUBELET_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/root/k8s/kubernetes/logs \
--hostname-override=k8s-master \
--network-plugin=cni \
--kubeconfig=/root/k8s/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/root/k8s/kubernetes/cfg/bootstrap.kubeconfig \
--config=/root/k8s/kubernetes/cfg/kubelet-config.yml \
--cert-dir=/root/k8s/kubernetes/ssl \
--pod-infra-container-image=lizhenliang/pause-amd64:3.0"

--hostname-override:顯示名稱,集群中唯一
--network-plugin:啟用CNI
--kubeconfig:空路徑,會(huì)自動(dòng)生成,后面用于連接apiserver
--bootstrap-kubeconfig:首次啟動(dòng)向apiserver申請證書
--config:配置參數(shù)文件
--cert-dir:kubelet證書生成目錄
--pod-infra-container-image:管理Pod網(wǎng)絡(luò)容器的鏡像

2-2.配置參數(shù)文件
cat > /root/k8s/kubernetes/cfg/kubelet-config.yml << EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2
clusterDomain: cluster.local 
failSwapOn: false
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /root/k8s/kubernetes/ssl/ca.pem 
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
evictionHard:
  imagefs.available: 15%
  memory.available: 100Mi
  nodefs.available: 10%
  nodefs.inodesFree: 5%
maxOpenFiles: 1000000
maxPods: 110
2-3.生成bootstrap.kubeconfig文件

下面是shell命令直接運(yùn)行

KUBE_APISERVER="https://192.168.1.222:6443" # apiserver IP:PORT
TOKEN="54c2956999675c60a4d8fd821d68edee" # 與token.csv里保持一致

# 生成 kubelet bootstrap kubeconfig 配置文件
kubectl config set-cluster kubernetes \
  --certificate-authority=/root/k8s/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=bootstrap.kubeconfig
kubectl config set-credentials "kubelet-bootstrap" \
  --token=${TOKEN} \
  --kubeconfig=bootstrap.kubeconfig
kubectl config set-context default \
  --cluster=kubernetes \
  --user="kubelet-bootstrap" \
  --kubeconfig=bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

執(zhí)行完會(huì)在當(dāng)前目錄生成 bootstrap.kubeconfig文件,將他拷貝到/root/k8s/kubernetes/cfg下


image.png
2-4.將kubelet加入服務(wù)啟動(dòng)
cat > /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kubelet.conf
ExecStart=/root/k8s/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
image.png

注意:
這里遇到了一個(gè)問題,開始kubelet是沒起來的,通過日志發(fā)現(xiàn)報(bào)錯(cuò):


image.png

通過docker info 發(fā)現(xiàn)我的docker cgroup driver是systemd(默認(rèn))。
解決方法:1.修改docker ,將daemon.json 把他的cgoup改成cgoupfs
2.修改kubelet-config.yml 將coupDriver改成systemd。 總之保證kubelet和docker引擎一直就可以。

2-5.批準(zhǔn)kubelet證書申請并加入集群

查看kubelet證書請求

**kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-5oXsZ7Bt1OtMcHaT9_U_EApCjuUiMNnfHb74SHYyGkw   15m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued

批準(zhǔn)申請 (最后面是證書請求的NAME)

kubectl certificate approve  node-csr-5oXsZ7Bt1OtMcHaT9_U_EApCjuUiMNnfHb74SHYyGkw

查看節(jié)點(diǎn)

**kubectl get node
image.png

3.部署kube-proxy

3-1.創(chuàng)建配置文件
cat > /root/k8s/kubernetes/cfg/kube-proxy.conf << EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/root/k8s/kubernetes/logs \\
--config=/root/k8s/kubernetes/cfg/kube-proxy-config.yml"
EOF
3-2.創(chuàng)建參數(shù)文件
cat > /root/k8s/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
clientConnection:
  kubeconfig: /root/k8s/kubernetes/cfg/kube-proxy.kubeconfig
hostnameOverride: k8s-master
clusterCIDR: 10.0.0.0/24
EOF
3-3.生成kube-proxy.kubeconfig文件

生成kube-proxy證書:

# 切換工作目錄
cd /root/TLS/k8s

# 創(chuàng)建證書請求文件
cat > kube-proxy-csr.json << EOF
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

生成證書

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

#ls kube-proxy*pem
#kube-proxy-key.pem  kube-proxy.pem

生成kubeconfig文件:

KUBE_APISERVER="https://192.168.1.222:6443"

kubectl config set-cluster kubernetes \
  --certificate-authority=/root/k8s/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
  --client-certificate=./kube-proxy.pem \
  --client-key=./kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

拷貝到配置文件指定路徑:

cp kube-proxy.kubeconfig /root/k8s/kubernetes/cfg/
3-4.將kube-proxy加入到系統(tǒng)服務(wù),啟動(dòng)
cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=/root/k8s/kubernetes/cfg/kube-proxy.conf
ExecStart=/root/k8s/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start kube-proxy
systemctl enable kube-proxy
image.png

六-部署CNI網(wǎng)絡(luò)

1.下載包
https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
2.創(chuàng)建目錄

mkdir -p /root/k8s/cni/bin
cd /root/k8s/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz  -C  .
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
##sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0-amd64#g" kube-flannel.yml
##如果鏡像地址無法訪問,修改可用的鏡像地址

會(huì)下載下來一個(gè)kube-flannel.yml
3.部署CNI網(wǎng)絡(luò)

kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-system
kubectl get node

Node準(zhǔn)備就緒 (圖中calico是后來自己又另外應(yīng)用了一次calico網(wǎng)絡(luò)組件產(chǎn)出的)


image.png

4.授權(quán)apiserver訪問kubelet

cat > apiserver-to-kubelet-rbac.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:kube-apiserver-to-kubelet
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/proxy
      - nodes/stats
      - nodes/log
      - nodes/spec
      - nodes/metrics 
      - pods/log
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kube-apiserver
  namespace: ""
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kube-apiserver-to-kubelet
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes
EOF

kubectl apply -f apiserver-to-kubelet-rbac.yaml

新增Worker Node

1.拷貝已部署好的Node相關(guān)文件到新節(jié)點(diǎn)(111,112機(jī)器)

scp -r kubernetes root@192.168.1.111:/root/k8s/
scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.1.111:/usr/lib/systemd/system/
scp -r cni root@192.168.1.111:/root/k8s/
scp kubernetes/ssl/ca.pem root@192.168.1.111:/root/k8s/kubernetes/ssl/
  1. 刪除kubelet證書和kubeconfig文件
    注:這幾個(gè)文件是證書申請審批后自動(dòng)生成的,每個(gè)Node不同,必須刪除重新生成。
rm kubernetes/cfg/kubelet.kubeconfig
rm -f kubernetes/ssl/kubelet*

3.修改node主機(jī)名(node節(jié)點(diǎn)運(yùn)行)

cd /root/k8s/kubernetes/cfg
vim kubelet.conf 修改hostname
--hostname-override=k8s-node1

vim kube-proxy-config.yml
hostnameOverride: k8s-node1

4.在node節(jié)點(diǎn)啟動(dòng)kubelet和kube-proxy服務(wù)

systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy
  1. 在Master節(jié)點(diǎn)批準(zhǔn)新Node kubelet證書申請
kubectl get csr
kubectl certificate approve node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro
image.png

6.查看Node狀態(tài)


image.png

剩下的112 節(jié)點(diǎn)加入集群同上,只是hostname修改一下。


image.png

七. Dashboard和CoreDNS

Dashboard : 簡單UI
CoreDNS: k8s內(nèi)部的DNS服務(wù)

1.部署Dashboard

https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

默認(rèn)Dashboard只能集群內(nèi)部訪問,修改Service為NodePort類型,暴露到外部:


image.png
1-1.部署組件
kubectl apply -f kubernertes-dashboard.yaml
1-2.查看服務(wù)狀態(tài)
kubectl get pods,svc -n kubernetes-dashboard
image.png
1-3.訪問Dashboard:

https://192.168.1.222:30001


image.png
1-4.創(chuàng)建service account并綁定默認(rèn)cluster-admin管理員集群角色,并創(chuàng)建一個(gè)token登陸
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
image.png

image.png

2.部署CoreDNS

用于集群內(nèi)部service名稱解析

kubectl apply -f coredns.yaml
[root@k8s-master1 k8s] kubectl get pods -n kube-system|grep dns
coredns-58d8cd457b-frkh9                  1/1     Running   0          55s

測試:

[root@k8s-master1 cfg]# kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernete
Server:    10.0.0.2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容