准備
服務器:3台機器——1台主、2台工作節點,可以使用virtualbox 搭建虛擬機
主機名 | centos version | ip | docker version | flannel version | 主機配置 | 備注 |
---|---|---|---|---|---|---|
master01 | 7.7.1908 | 192.168.56.101 | 19.03.8 | v0.12.0-amd64 | 2P 2G 20G | |
node01 | 7.7.1908 | 192.168.56.102 | 19.03.8 | v0.12.0-amd64 | 2P 2G 20G | |
node02 | 7.7.1908 | 192.168.56.103 | 19.03.8 | v0.12.0-amd64 | 2P 2G 20G |
k8s版本
主機名 | kubelet version | kubeadm version | kubectl version | 備注 |
---|---|---|---|---|
master01 | v1.18.2 | v1.18.2 | v1.18.2 | |
node01 | v1.18.2 | v1.18.2 | v1.18.2 | |
node01 | v1.18.2 | v1.18.2 | v1.18.2 |
基本設置:
關閉防火牆:
systemctl stop firewalld & systemctl disable firewalld
關閉swap
#臨時關閉
swapoff -a
#永久關閉,重啟后生效
vi /etc/fstab
#注釋以下代碼
/dev/mapper/centos-swap swap ...
關閉selinux
#獲取狀態
getenforce
#暫時關閉
setenforce 0
#永久關閉 需重啟
vi /etc/sysconfig/selinux
#修改以下參數,設置為disable
SELINUX=disabled
修改網絡配置
# 所有機器上都要進行
$ cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#
$ sysctl --system
統一時間【如果需要】
#統一時區,為上海時區
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
bash -c "echo 'Asia/Shanghai' > /etc/timezone"
#統一使用阿里服務器進行時間更新
yum install -y ntpdate #安裝ntpdate工具
ntpdate ntp1.aliyun.com #更新時間
安裝docker:
- 1,刪除原有的docker組件
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
- 2,配置系統docker源
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
## 注意:此處更換了阿里的源,適用國內用戶
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 3,查看docker安裝列表,選擇並安裝
sudo yum list docker-ce --showduplicates
# 此處直接安裝最新版本的docker-ce
sudo yum install -y docker-ce
# 注:如果要安裝指定的版本可以參考下邊的命令
sudo yum install -y docker-ce-3:19.03.8-3.el7.x86_64
- 4.啟動docker
sudo systemctl enable docker && systemctl start docker
- 5.更換鏡像倉庫源 阿里雲docker倉庫
# 進入阿里雲帳號,依次進入:控制台——容器鏡像服務(可以搜索到)——鏡像中心——鏡像加速器。鏡像加速器中獲取到加速器地址: "https://xxxxxxx.mirror.aliyuncs.com"
#linux下默認文件為/etc/docker/daemon.json,添加下列倉庫
$ sudo vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
# 重啟docker使其生效
$ sudo systemctl restart docker
安裝K8S組件:
- 1,更新K8S源
$ 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
- 2, kubelet、kubeadm、kubectl
$ yum install -y kubelet kubeadm kubectl
# 啟動kubelet 服務
$ systemctl enable kubelet && systemctl start kubelet
host配置
#分別在服務器上修改hostname,使用hostnamectl命令,或者直接修改/etc/hostname 文件
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
#每台機器都執行
# cat >> /etc/hosts << EOF
192.168.56.101 master01
192.168.56.102 node01
192.168.56.103 node02
EOF
# check
# cat /etc/hosts
驗證MAC地址確保唯一
# enp0s3 網卡設備名稱,根據自己實際情況進行改動
# cat /sys/class/net/enp0s3/address
# cat /sys/class/dmi/id/product_uuid
配置master服務器
配置k8s初始化文件
master節點下 生成默認配置文件
$ kubeadm config print init-defaults > init-kubeadm.conf
修改init-kubeadm.conf 主要參數
#imageRepository: k8s.gcr.io 更換k8s鏡像倉庫
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# kubernetesVersion: v1.18.0 修改為版本 v1.18.2
kubernetesVersion: v1.18.2
# localAPIEndpointc,advertiseAddress為master-ip ,port默認不修改
localAPIEndpoint:
advertiseAddress: 192.168.56.101 #此處為master的IP
bindPort: 6443
# 配置子網絡
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 #添加pod子網絡,使用的是flannel網絡
拉取下載k8s組件
#查看安裝時需要的鏡像文件列表
$ kubeadm config images list --config init-kubeadm.conf
k8s.gcr.io/kube-apiserver:v1.18.2
k8s.gcr.io/kube-controller-manager:v1.18.2
k8s.gcr.io/kube-scheduler:v1.18.2
k8s.gcr.io/kube-proxy:v1.18.2
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
#下載,根據配置文件進行鏡像下載,如果此處下載比較緩慢可以考慮更換配置文件中的imageRepository參數
$ kubeadm config images pull --config init-kubeadm.conf
初始化k8s
# init
#如果kubeadm init過了,此時需要加個參數來忽略到這些:--ignore-preflight-errors=all
$ kubeadm init --config init-kubeadm.conf
# 啟動后可以根據提示執行下列命令,並記錄john token
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 此處要記錄下 join語句,如果join token忘記,則需要執行下邊命令重新生成
$ kubeadm token create --print-join-command
kubeadm join 192.168.56.101:6443 --token abcdeff.zlo1o2t9i8e53whd --discovery-token-ca-cert-hash sha256:3613c3bc855b5d9e1555b99ebd21f48873d20353aeb8c2c64e73d8c7597d43f9
#--------------------以下為均一些狀態查看命令,可以不執行--------------------
# 查看啟動狀態
[root@master01 kube]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 NotReady master 16m v1.18.2
[root@master01 kube]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
# 查看具體初始化情況
$ kubectl get pods -n kube-system -0 wide
NAME READY STATUS RESTARTS AGE
coredns-546565776c-6kbxw 1/1 Running 2 16h
coredns-546565776c-bmfgz 1/1 Running 2 16h
etcd-master01 1/1 Running 9 16h
kube-apiserver-master01 1/1 Running 9 16h
kube-controller-manager-master01 1/1 Running 9 16h
kube-flannel-ds-amd64-8qphl 1/1 Running 3 14h
kube-flannel-ds-amd64-c8hrq 1/1 Running 3 13h
kube-flannel-ds-amd64-lcmhs 1/1 Running 2 16h
kube-proxy-6wv5w 1/1 Running 3 13h
kube-proxy-f4x2t 1/1 Running 4 16h
kube-proxy-m464b 1/1 Running 13 14h
kube-scheduler-master01 1/1 Running 10 16h
# 查看 kube-flannel-ds-amd64-c8hrq 狀態
$ kubectl describe pod kube-flannel-ds-amd64-c8hrq -n kube-system
flannel網絡配置
#下載 配置文件
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#下載
$ kubectl apply -f kube-flannel.yml
# 問題解決:
# 此處如果沒法下載配置文件kube-flannel.yml,raw.githubusercontent.com訪問拒絕
# 通過IPAddress.com 查詢真實IP,輸入raw.githubusercontent.com查詢到真實IP地址(例如:199.232.4.133)
# 添加到hosts中,
$ sudo vi /etc/hosts
199.232.4.133 raw.githubusercontent.com
配置node
node節點 初始化內容
#拷貝 master機器上 $HOME/.kube/config 到node節點上
scp $HOME/.kube/config root@node01:~/
scp $HOME/.kube/config root@node02:~/
#分別在node01和node02上執行下邊命令
#不然執行kubectl 會報錯
#error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
mkdir -p $HOME/.kube
sudo mv $HOME/config $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
節點注冊方法1:直接使用命令節點注冊【推薦】
#直接使用指令加入
$ kubeadm join 192.168.56.101:6443 --token abcdeff.zlo1o2t9i8e53whd --discovery-token-ca-cert-hash sha256:3613c3bc855b5d9e1555b99ebd21f48873d20353aeb8c2c64e73d8c7597d43f9
# token加入語句忘記了可以在master上使用下邊命令進行生成
$ kubeadm token create --print-join-command
節點注冊方法2:使用 join-config.yml 進行節點注冊
# node 節點上生成 join-config.yml,並對主要的參數做修改
$ kubeadm config print join-defaults > join-config.yaml
# join-config.yaml 內容
apiVersion: kubeadm.k8s.io/v1beta2
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
bootstrapToken:
apiServerEndpoint: kube-apiserver:6443 # 修改為master機器ip:port,192.168.56.101:6443
token: abcdef.0123456789abcdef # 修改為真實token
unsafeSkipCAVerification: true
timeout: 5m0s
tlsBootstrapToken: abcdef.0123456789abcdef # 修改為真實token
kind: JoinConfiguration
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: node01 # 根據實際節點名進行修改
taints: null
#使用配置文件加入
$ kubeadm join --config=join-config.yaml
添加flannel網絡
#下載 配置文件
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#或者拷貝 master機器上的文件
scp root@master01:~/workspace/kube/kube-flannel.yml .
#下載
$ kubectl apply -f kube-flannel.yml
# 查看節點添加狀況
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready master 16h v1.18.2
node01 Ready <none> 12h v1.18.2
node02 Ready <none> 12h v1.18.2
常見問題
node節點NotReady
# 查看pod 狀態
$ kubectl get pods -n kube-system -0 wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel-ds-amd64-gtlwv 1/1 Running 4 4h23m 192.168.56.101 master01 <none> <none>
kube-flannel-ds-amd64-m78z2 0/1 Init:0/1 0 3h13m 192.168.56.103 node02 <none> <none>
# Init:0/1 錯誤,查看詳情
$ kubectl describe pod kube-flannel-ds-amd64-m78z2 -n kube-system
# 一般都是flannel的docker鏡像沒有下載成功
# 可以在node2上,執行docker images 查看是否有flannel鏡像,如果沒有手動下載
node節點刪除重新加入
# -----重新加入注冊
# 刪除指定node
$ kubectl delete node node01
# 刪除對應的配置文件以及證書
$ rm -rf /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt && systemctl restart docker kubelet
# 重新執行注冊語句