Kubernetes
一、 Kubernetes介紹
各節點所需組件
Master:docker,kubeadm,kubelet,
組件 |
版本 |
備注 |
Kubelet |
1.13.5 |
組件 |
Kubeadm |
1.13.5 |
組件 |
Kubectl |
1.13.5 |
組件 |
Docker |
18.0.9.3 |
CgroupDriver: systemd |
kube-proxy |
V1.13.5 |
鏡像 |
kube-controller-manager |
V1.13.5 |
鏡像 |
kube-apiserver |
V1.13.5 |
鏡像 |
kube-scheduler |
V1.13.5 |
鏡像 |
quay.io/coreos/flannel |
v0.11.0-amd64 |
鏡像 |
Coredns |
1.2.6 |
鏡像 |
Etcd |
3.2.24 |
鏡像 |
pause |
3.1 |
鏡像 |
節點信息
地址 |
角色 |
備注 |
172.18.14.90 |
Master |
|
172.18.14.91 |
Node |
|
172.18.14.92 |
node |
|
二、 環境配置
Docker安裝省略,kubermetes1.13.5版本最高支持docker18.06這里安裝的是18.09
一、 以root用戶登陸,配置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
二、 禁用selinux,關閉防火牆
修改配置文件/etc/selinux/ config
SELINUX=disabled
#setenforce 0
或者
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
三、 設置網橋包經IPTables,core文件生成路徑
echo """
vm.swappiness = 0
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
""" > /etc/sysctl.conf
sysctl -p
四、 同步時間
yum install -y ntpdate
ntpdate -u ntp5.aliyun.com
#ntp1-7. aliyun.com都可以,如無法聯網則可以自建ntp服務器
五、 更新內核
升級內核(可選),1.14版本支持5.0,1.13.5可忽略警告
$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
上述命令為啟用elrepo倉庫,我們可以使用以下命令列出可用的系統內核相關包:
$ yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
之后,就可以安裝最新的穩定內核:
$ yum --enablerepo=elrepo-kernel install kernel-ml
重啟機器,並選擇最新安裝的內核(第一個)
進入系統之后,查看內核版本uname -r
設置GRUB默認的內核版本
啟動系統時,系統默認選擇之前的版本,所以我們需要設置一下GRUB
重新創建內核配置
$ grub2-mkconfig -o /boot/grub2/grubenv
重啟
六、 重啟# 確認內核版本后,開啟IPVS #功能開啟暫時未使用
#uname -a
#cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
#chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
三、 安裝kubernetes組件
通過kubeadm安裝部署,鏡像倉庫采用阿里雲。安裝速度取決於網速
一、 安裝組件
#最新版1.14安裝測試問題較多,所以用了1.13.5
yum install -y kubelet-1.13.5 kubeadm-1.13.5 kubectl-1.13.5
二、 初始化master
#kubeadm init --kubernetes-version=1.13.5 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=swap --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors=SystemVerification
# --pod-network-cidr使用flannel網絡解決方案,默認10.244.0.0/16,如不指使用flannel時則會失敗
#--image-repository 使用阿里雲鏡像源,免去 科xue上網
#--ignore-preflight==SystemVerification 忽略內核版本
#--ignore-preflight-errors=swap 忽略swap設備警告,建議禁止swap設備
出現如下即成功
添加flannel插件:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
三、 執行腳本
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
四、 記錄令牌
l 添加Work節點
kubeadm join 172.18.14.90:6443 --token 17s13m.l22ssehvmm8ka1fy --discovery-token-ca-cert-hash sha256:90775d540aeb69e0e74405a3c3dd754afec0e58c020c312c07afc01b2813a4e7 --ignore-preflight-errors=swap --ignore-preflight-errors=SystemVerification
l 查看狀態
# kubectl get node
# kubectl get pod --all-name-spaces
四、 安裝dashboard
詳情可見:https://github.com/kubernetes/dashboard
個人參考:https://www.jianshu.com/p/c6d560d12d50
一、 下載鏡像
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64
更名
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64 k8s.gcr.io/kubernetes-dashboard-amd64
二、 部署
#master節點執行如下
# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
#開啟代理
# kubectl proxy
如下所示已正常運行。
測試發現dashboard的證書過期,用瀏覽器無法訪問。
三、 制作證書
命令參考:alias ksys='kubectl -n kube-system'
1) 生成證書通過openssl生成自簽名證書
#cd /root/keys
# openssl genrsa -out dashboard.key 2048
# openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=172.18.14.90‘
# openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
# openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.cr
#openssl x509 -in dashboard.crt -text -nooutt
這樣就有了證書文件dashboard.crt 和 私鑰 dashboad.key
2) 下載yaml,並修改
#wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml |
#刪除Dashboard Secret字段中的內容
#修改service 為nodeport類型,固定訪問端口
修改前
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard |
修改后
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: type: NodePort ports: - port: 443 nodePort:30003 #固定30003端口 targetPort: 8443 selector: k8s-app: kubernetes-dashboard |
3) 生成secret
#ksys create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt
#ksys get secret | grep dashboard
#ksys describe secret kubernetes-dashboard-certs
如下圖所示
4) 重新apply yaml文件
#kubectl apply -f kubernetes-dashboard.yaml
查看服務狀態
5) 通過瀏覽器訪問:
四、 設置DashBoard-身份驗證
登錄dashboard
的時候支持Kubeconfig
和token
兩種認證方式,Kubeconfig 中也依賴token 字段,所以生成token 這一步是必不可少的。
生成token
我們創建一個admin
用戶並授予admin 角色綁定,使用下面的yaml文件創建admin用戶並賦予他管理員權限,然后就可以通過token 登陸dashbaord
,這種認證方式本質實際上是通過Service Account
的身份認證加上Bearer token
請求 API server 的方式實現,參考 Kubernetes 中的認證
1)
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: admin annotations: rbac.authorization.kubernetes.io/autoupdate: "true" roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: admin namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: admin namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile |
.在node節點上創建:vim admin-sa.yaml
2) 執行如下
#kubectl create -f admin-sa.yaml
#查看是否成功
3) 獲取token
#kubectl get secret gitlab-admin -o jsonpath="{['data']['token']}" | base64 --decode
屏幕輸出相應token,輸入就可以登陸
五、 記錄坑
l 下載鏡像
可通過
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/鏡像名字:版本號
注意冒號,然后tag自己所需的鏡像名
l master開放6443端口(建議禁用firewalld和iptables)
l 查看kubelet報錯詳細信息
journalctl -xeu kubelet
l kubelet增加啟動參數
建議禁用swap設備
l 設置docker 驅動
#more /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
#systemctl daemon-reload
# systemctl restart docker
#docekr info 查看是否更改