Kubernetes1.18.18 集羣部署

Kubernetes1.18.18 集羣部署

標籤(空格分隔): kubernetes升級系列node


[toc]linux


一:環境初始化準備

1.1 環境信息

系統:CentOS7.9x64

主機名:
cat /etc/hosts
-----
192.168.3.171   t-k8sM-001
192.168.3.172   t-k8sM-002
192.168.3.173   t-k8sM-003
192.168.3.174   t-k8sN-001
192.168.3.175   t-k8sN-002
------

1.2 環境部署需求

1.2.1 單Master架構圖:

1.2.2 部署角色分配

t-k8sM-001 ---> apiserver/controller-manager/scheduer/etcd
 t-k8sM-002 ---> apiserver/controller-manager/scheduer/etcd
 t-k8sM-003 ---> apiserver/controller-manager/scheduer/etcd
 t-k8sN-001 ----> docker/kubelet/kube-proxy/etcd/   
 t-k8sN-002 ----> docker/kubelet/kube-proxy/etcd/

1.2.3 系統初始化

# 關閉防火牆
systemctl stop firewalld
systemctl disable firewalld

# 關閉selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 臨時

# 關閉swap
swapoff -a  # 臨時
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 根據規劃設置主機名
hostnamectl set-hostname <hostname>

# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.3.171   t-k8sM-001
192.168.3.172   t-k8sM-002
192.168.3.173   t-k8sM-003
192.168.3.174   t-k8sN-001
192.168.3.175   t-k8sN-002
EOF

# 將橋接的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  # 生效

# 時間同步
yum install chronyd
server ntp1.aliyun.com

##二:ETCD 環境部署git

2.1 etcd 介紹

Etcd 的概念:
Etcd 是一個分佈式鍵值存儲系統,Kubernetes使用Etcd進行數據存儲,因此先準備一個Etcd數據庫,爲解決Etcd單點故障,應採用集羣方式部署,這裏使用3臺組建集羣,可容忍1臺機器故障,固然,你也可使用5臺組建集羣,可容忍2臺機器故障。

2.2 部署etcd集羣

2.2.1 自簽名ETCD 證書

cfssl是一個開源的證書管理工具,使用json文件生成證書,相比openssl更方便使用。
找任意一臺服務器操做,這裏用Master節點。
---
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/bin/cfssl
mv cfssljson_linux-amd64 /usr/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
1. 自簽證書頒發機構(CA)

建立工做目錄:

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

cd TLS/etcd
---
自籤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 -
2. 使用自籤CA簽發Etcd HTTPS證書

建立證書申請文件:

cat > server-csr.json << EOF
{
    "CN": "etcd",
    "hosts": [
    "192.168.3.171",
    "192.168.3.172",
    "192.168.3.173",
    "192.168.3.174",
    "192.168.3.175",
    "192.168.3.176",
    "192.168.3.177",
    "192.168.3.178",
    "192.168.3.179",
    "192.168.3.180",
    "192.168.3.181",
    "192.168.3.182",
    "192.168.3.183",
    "192.168.3.184",
    "192.168.3.185",
    "192.168.3.186",
    "192.168.3.187",
    "192.168.3.188",
    "192.168.3.189",
    "192.168.3.201"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
}
EOF

生成證書:
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

2.2.2下載安裝etcd

下載地址:https://github.com/etcd-io/etcd/releases/download/v3.4.14/etcd-v3.4.14-linux-amd64.tar.gz

如下在節點1上操做,爲簡化操做,待會將節點1生成的全部文件拷貝到節點2和節點3.

1. 建立工做目錄並解壓二進制包

mkdir /data/application/etcd/{bin,cfg,ssl} -p
tar zxvf etcd-v3.4.14-linux-amd64.tar.gz
mv etcd-v3.4.14-linux-amd64/{etcd,etcdctl} /data/application/etcd/bin/
建立etcd配置文件
cat > /data/application/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.3.171:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.3.171:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.3.171:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.3.171:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.3.171:2380,etcd-2=https://192.168.3.172:2380,etcd-3=https://192.168.3.173:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF

----
ETCD_NAME:節點名稱,集羣中惟一
ETCD_DATA_DIR:數據目錄
ETCD_LISTEN_PEER_URLS:集羣通訊監聽地址
ETCD_LISTEN_CLIENT_URLS:客戶端訪問監聽地址
ETCD_INITIAL_ADVERTISE_PEER_URLS:集羣通告地址
ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址
ETCD_INITIAL_CLUSTER:集羣節點地址
ETCD_INITIAL_CLUSTER_TOKEN:集羣Token
ETCD_INITIAL_CLUSTER_STATE:加入集羣的當前狀態,new是新集羣,existing表示加入已有集羣
-----

systemd管理etcd 啓動文件
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/data/application/etcd/cfg/etcd.conf
ExecStart=/data/application/etcd/bin/etcd \
--cert-file=/data/application/etcd/ssl/server.pem \
--key-file=/data/application/etcd/ssl/server-key.pem \
--peer-cert-file=/data/application/etcd/ssl/server.pem \
--peer-key-file=/data/application/etcd/ssl/server-key.pem \
--trusted-ca-file=/data/application/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/data/application/etcd/ssl/ca.pem \
--logger=zap
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF

拷貝剛纔生成的證書

把剛纔生成的證書拷貝到配置文件中的路徑:
cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /data/application/etcd/ssl/
同步全部節點:
scp -P36022 -r /data/application/etcd/ root@192.168.3.172:/data/application/
scp -P36022 /usr/lib/systemd/system/etcd.service root@192.168.3.172:/usr/lib/systemd/system/
scp -P36022 -r /data/application/etcd/ root@192.168.3.173:/opt/application/
scp -P36022 /usr/lib/systemd/system/etcd.service root@192.168.3.173:/usr/lib/systemd/system/
而後在節點2和節點3分別修改etcd.conf配置文件中的節點名稱和當前服務器IP:
vi /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-1"   # 修改此處,節點2改成etcd-2,節點3改成etcd-3
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.3.171:2380"   # 修改此處爲當前服務器IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.3.171:2379" # 修改此處爲當前服務器IP

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.3.171:2380" # 修改此處爲當前服務器IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.3.171:2379" # 修改此處爲當前服務器IP
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.3.171:2380,etcd-2=https://192.168.3.172:2380,etcd-3=https://192.168.3.173:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

啓動etcd 

同步全部啓動全部節點:

systemctl daemon-reload
systemctl start etcd
systemctl enable etcd

測試:
   ETCDCTL_API=3 /data/application/etcd/bin/etcdctl --cacert=/data/application/etcd/ssl/ca.pem --cert=/data/application/etcd/ssl/server.pem --key=/data/application/etcd/ssl/server-key.pem --endpoints="https://192.168.3.171:2379,https://192.168.3.172:2379,https://192.168.3.173:2379" endpoint health

三 部署kubernetes集羣

3.1 部署k8s的Master Node

生成kube-apiserver證書

1. 自簽證書頒發機構(CA)

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 -

使用自籤CA簽發kube-apiserver HTTPS證書
建立證書申請文件:

cat > server-csr.json << EOF
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "192.168.3.171",
      "192.168.3.172",
      "192.168.3.173",
      "192.168.3.174",
      "192.168.3.175",
      "192.168.3.176",
      "192.168.3.177",
      "192.168.3.178",
      "192.168.3.179",
      "192.168.3.180",
      "192.168.3.181",
      "192.168.3.182",
      "192.168.3.183",
      "192.168.3.184",
      "192.168.3.185",
      "192.168.3.186",
      "192.168.3.187",
      "192.168.3.188",
      "192.168.3.189",
      "192.168.3.201",
      "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

注:上述文件hosts字段中IP爲全部Master/LB/VIP IP,一個都不能少!爲了方便後期擴容能夠多寫幾個預留的IP。

生成證書:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
k8s 的下載安裝
  從Github下載二進制文件

下載地址: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183

注:打開連接你會發現裏面有不少包,下載一個server包就夠了,包含了Master和Worker Node二進制文件。

解壓二進制包

mkdir -p /data/application/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 /data/application/kubernetes/bin
cp kubectl /usr/bin/
部署apiserver

 部署kube-apiserver

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

拷貝剛纔生成的證書

把剛纔生成的證書拷貝到配置文件中的路徑:
cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /data/application/kubernetes/ssl/

啓用 TLS Bootstrapping 機制

TLS Bootstraping:Master apiserver啓用TLS認證後,Node節點kubelet和kube-proxy要與kube-apiserver進行通訊,必須使用CA簽發的有效證書才能夠,當Node節點不少時,這種客戶端證書頒發須要大量工做,一樣也會增長集羣擴展複雜度。爲了簡化流程,Kubernetes引入了TLS bootstraping機制來自動頒發客戶端證書,kubelet會以一個低權限用戶自動向apiserver申請證書,kubelet的證書由apiserver動態簽署。因此強烈建議在Node上使用這種方式,目前主要用於kubelet,kube-proxy仍是由咱們統一頒發一個證書。

TLS bootstraping 工做流程:
建立上述配置文件中token文件:

cat > /data/application/kubernetes/cfg/token.csv << EOF
c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper"
EOF
systemd管理apiserver

cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/data/application/kubernetes/cfg/kube-apiserver.conf
ExecStart=/data/application/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
受權kubelet-bootstrap用戶容許請求證書

kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
部署kube-controller-manager
建立配置文件

cat > /data/application/kubernetes/cfg/kube-controller-manager.conf << EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/data/application/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/16 \\
--cluster-signing-cert-file=/data/application/kubernetes/ssl/ca.pem \\
--cluster-signing-key-file=/data/application/kubernetes/ssl/ca-key.pem  \\
--root-ca-file=/data/application/kubernetes/ssl/ca.pem \\
--service-account-private-key-file=/data/application/kubernetes/ssl/ca-key.pem \\
--experimental-cluster-signing-duration=87600h0m0s"
EOF

systemd管理controller-manager
  cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/data/application/kubernetes/cfg/kube-controller-manager.conf
ExecStart=/data/application/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

部署kube-scheduler

1. 建立配置文件

cat > /data/application/kubernetes/cfg/kube-scheduler.conf << EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/data/application/kubernetes/logs \
--leader-elect \
--master=127.0.0.1:8080 \
--bind-address=127.0.0.1"
EOF

systemd管理scheduler

cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/data/application/kubernetes/cfg/kube-scheduler.conf
ExecStart=/data/application/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

查看集羣狀態:
    kubectl get cs

3.2 部署node 節點

t-k8sN-001 節點部署docker:
  下載地址:https://download.docker.com/linux/static/stable/x86_64/docker-20.10.3.tgz

如下在全部節點操做。這裏採用二進制安裝,用yum安裝也同樣。
t-k8sN-001 與 t-k8sN-002 節點上面安裝

解壓二進制包

tar zxvf docker-20.10.3.tgz
mv docker/* /usr/bin

systemd管理docker

cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF

建立配置文件

mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

啓動並設置開機啓動

systemctl daemon-reload
systemctl start docker
systemctl enable docker

配置k8s目錄
   下面仍是在Master Node上操做,即同時做爲Worker Node

建立工做目錄並拷貝二進制文件

在全部worker node建立工做目錄:

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
從master節點拷貝

cd /software/kubernetes/server/bin
cp kubelet kube-proxy /data/application/kubernetes/bin   # 本地拷貝

部署kubelet
1. 建立配置文件

cat > /data/application/kubernetes/cfg/kubelet.conf << EOF
KUBELET_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/data/application/kubernetes/logs \\
--hostname-override=t-k8sM-001 \\
--network-plugin=cni \\
--kubeconfig=/data/application/kubernetes/cfg/kubelet.kubeconfig \\
--bootstrap-kubeconfig=/data/application/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/data/application/kubernetes/cfg/kubelet-config.yml \\
--cert-dir=/data/application/kubernetes/ssl \\
--pod-infra-container-image=lizhenliang/pause-amd64:3.0"
EOF

配置參數文件
cat > /data/application/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: /data/application/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
EOF
在 server節點上面執行

 生成bootstrap.kubeconfig文件
寫一個boot.sh 腳本 把下面的內容放進去
---

KUBE_APISERVER="https://192.168.3.171:6443" # apiserver IP:PORT
TOKEN="c47ffb939f5ca36231d9e3121a252940" # 與token.csv裏保持一致

# 生成 kubelet bootstrap kubeconfig 配置文件
kubectl config set-cluster kubernetes \
  --certificate-authority=/data/application/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
---

. ./boot.sh
拷貝到配置文件路徑:

cp bootstrap.kubeconfig /data/application/kubernetes/cfg

同步k8s 安裝目錄到 t-k8sN-001 節點:
scp -P36022 -r /data/application/kubernetes/ root@192.168.3.174:/data/application/
刪掉 日誌目錄(t-k8sN-001)
 cd /data/application/kubernetes/logs/
  rm -rf *
修改kubelet.conf 文件
cd /data/application/kubernetes/cfg/
vim kubelet.conf 
-----
--hostname-override=t-k8sN-001
----

systemd管理kubelet

cat > /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
啓動kubelet 開機啓動

systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet

t-k8sM-001 配置受權
 kubectl get csr

批准申請

kubectl certificate approve node-csr-ogqwQ6-0S8zTmL9nF84MXk24_GUsZYi1ecc7Eu0udV8

kubectl get node
注:因爲網絡插件尚未部署,節點會沒有準備就緒 NotReady

部署kube-proxy
    部署kube-proxy 
   1. 建立配置文件

cat > /data/application/kubernetes/cfg/kube-proxy.conf << EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/data/application/kubernetes/logs \\
--config=/data/application/kubernetes/cfg/kube-proxy-config.yml"
EOF

配置參數文件

cat > /data/application/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: /data/application/kubernetes/cfg/kube-proxy.kubeconfig
hostnameOverride: t-k8sN-001
clusterCIDR: 10.0.0.0/16
mode: ipvs
ipvs:
  scheduler: "rr"
iptables:
  masqueradeAll: true
EOF
# 切換工做目錄
cd /root/TLS/k8s
  # 建立證書請求文件
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

cp -p kube-proxy-key.pem  kube-proxy.pem /data/application/kubernetes/ssl/

生成kubeconfig文件:
cd /opt/kubernetes/ssl/
vim kubeconfig.sh
----
KUBE_APISERVER="https://192.168.3.171:6443"

kubectl config set-cluster kubernetes \
  --certificate-authority=/data/application/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 -p kube-proxy.kubeconfig /data/application/kubernetes/cfg/

同步/data/application/kubernetes 目錄
scp -P36022 -r /data/application/kubernetes/ root@192.168.3.174:/data/application/

在t-k8sN-001 上面修改文件

cd /opt/kubernetes/cfg
 vim kubelet.conf

--hostname-override=t-k8sN-001

 vim kube-proxy-config.yml

hostnameOverride: t-k8sN-001

systemd管理kube-proxy

cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=/data/application/kubernetes/cfg/kube-proxy.conf
ExecStart=/data/application/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

部署CNI
   部署CNI網絡

先準備好CNI二進制文件:

下載地址:https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz

解壓二進制包並移動到默認工做目錄:
mkdir /opt/cni/bin -p
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
scp -p36022 -r /opt/cni/ root@192.168.3.174:/opt/

部署CNI網絡:

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

kubectl apply -f kube-flannel.yml

kubectl get node

四:增長一個worker node

4.1 先在增長節點部署一個docker

docker -version
增長 一個 work節點:(從t-k8sN-001 節點同步目錄)
 scp -P36022 -r /data/application/kubernetes root@192.168.3.175:/data/application/

 scp -P36022 -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.3.175:/usr/lib/systemd/system

scp -P36022 -r /opt/cni/ root@192.168.3.175:/opt/

scp -P36022 -r /data/application/kubernetes/ssl/ca.pem root@192.168.3.175:/data/application/kubernetes/ssl
刪掉 生成文件
 刪除kubelet證書和kubeconfig文件
rm -rf /data/application/kubernetes/cfg/kubelet.kubeconfig 
rm -rf /data/application/kubernetes/ssl/kubelet*
修改主機名

vim /data/application/kubernetes/cfg/kubelet.conf
--hostname-override=t-k8sN-002

vim /data/application/kubernetes/cfg/kube-proxy-config.yml
hostnameOverride: t-k8sN-002

設置開機啓動
啓動並設置開機啓動

systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy
kubectl get csr 
kubectl certificate approve node-csr-wVXc2iMF7kE3a1qjwIGo7qkG0l0lNOGLWaOkU3x7j54
kubectl get node

##五:配置部署Dashboard和CoreDNSgithub

5.1 部署Dashboard

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

默認Dashboard只能集羣內部訪問,修改Service爲NodePort類型,暴露到外部:

      vim recommended.yaml

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

默認Dashboard只能集羣內部訪問,修改Service爲NodePort類型,暴露到外部:

 vim recommended.yaml
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  type: NodePort
  selector:
    k8s-app: kubernetes-dashboard
----

kubectl apply -f recommended.yaml

kubectl get pods,svc -n kubernetes-dashboard
---
建立service account並綁定默認cluster-admin管理員集羣角色:

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}')

打開firefox web 訪問:
   https://192.168.3.174:30001

5.2 配置coreDNS

配置coreDNS 

  kubectl apply -f coredns.yaml
DNS解析測試:

kubectl run -it --rm dns-test --image=busybox:1.28.4 sh

進入容器問題:
    建立apiserver到kubelet的權限,就是沒有給kubernetes用戶rbac受權

error: unable to upgrade connection: Forbidden (user=kubernetes, verb=create, resource=nodes, subresource=proxy)

cat > apiserver-to-kubelet.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:kubernetes-to-kubelet
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/proxy
      - nodes/stats
      - nodes/log
      - nodes/spec
      - nodes/metrics
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kubernetes
  namespace: ""
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kubernetes-to-kubelet
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes
EOF

kubectl apply -f apiserver-to-kubelet.yaml

kubectl run -it --rm dns-test --image=busybox:1.28.4 sh

nslookup kubernetes
相關文章
相關標籤/搜索