k8s-kubeadm安裝-02

官方資料:https://feisky.gitbooks.io/kubernetes/components/kubeadm.html
[Kubernetes] 國內獲取 Kubernetes 鏡像的方法
https://blog.csdn.net/shida_csdn/article/details/78480241
https://www.cnblogs.com/fengzhihai/p/9849683.html
Rancher方式:
二次封裝的常用發行版【可視化構建kubernetes】
minikube方式:
Minikube是一個工具,可以在本地快速運行一個單點的Kubernetes,適合嘗試Kubernetes或日常開發的用戶使用,但是不能用於生產環境。
kubeadm方式:
Kubeadm也是一個工具,提供kubeadm init和kubeadm join,可用於快速部署Kubernetes集羣。
二進制包方式:
從官方下載發行版的二進制包,手動部署每個組件,組成Kubernetes集羣,過程較爲繁瑣。

本例使用kubeadmin工具安裝。
安裝要求:
1、centos7.X
2、2G、2C、30GB
3、集羣之間網絡互通
4、可以訪問外網,需要拉去鏡像


部署步驟:
0、設置先設條件
1、在所有節點上安裝Doctor和kubeadm、kubelet
2、部署kubernetes的Master
3、部署容器網絡插件
4、部署kubernetes Node,將節點加入到kubernetes集羣中
5、部署Dashboard Web頁面,可視化查看Kubernetes資源


先設條件【所有節點】:
1、關閉防火牆【影響通信,學習,也可以將默認的規則清空重新生成】
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

2、關閉selinux:linux下的一個安全機制,主要是對文件系統訪問做一個權限控制,這個權限控制會影響到kubernetes中的一個組件kuberlete的安裝,因爲這個組件的安裝會訪問本地的文件操作系統
setenforce 0
vim /etc/selinux/config :# 更改爲 SELINUX=disabled
getenforce:快照查詢

3、禁止swap分區:swap分區的作用是當物理內存不足時,利用swap分區做數據交換,但是在kubernetes中完全不支持swap分區,所以必須禁止掉,或者創建系統的時候就不創建他
    臨時關閉:swapoff -a
    永久性關閉: vim /etc/fstab 
    中註釋掉:/dev/mapper/centos-swap swap     swap    defaults        0 0
sysctl --system

4、添加主機名和對應ip的關係
ip1    主機名1
ip2    主機名2
ip3    主機名3

5、時間同步【啓動chronyd系統服務】
systemctl  start  chronyd.service
systemctl  enable  chronyd.service

6、將橋接的IPv4流量傳遞到iptables的鏈【有一些ipv4的流量不能走iptables鏈【linux內核的一個過濾器,每個流量都會經過他,然後再匹配是否可進入當前應用進程去處理】,導致流量丟失】:
配置k8s.conf文件(#k8s.conf文件原來不存在,需要自己創建的)
cat /etc/sysctl.d/k8s.conf       
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
vm.swappiness=0

sysctl --system

安裝安裝Doctor、kubeadm【引導集羣的客戶端工具】、kubelet【kubernetes中管理容器】【所有節點】
1、安裝Docker
配置Docker官方源並將下載的源文件存放於/etc/yum.repos.d/下:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
安裝:yum -y install docker-ce-18.06.1.ce-3.el7
設置開機啓動並啓動docker:systemctl enable docker && systemctl start docker

2、安裝kubeadm、kubelet、kubectl
配置kubernetes的阿里YUM軟件源: 放在 /etc/yum.repos.d 目錄下,vim /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
安裝:
yum install -y kubelet-1.13.3
yum install -y kubeadm-1.13.3
yum install -y kubectl-1.13.3
systemctl enable kubelet【此時此刻不需要啓動kubelet,因爲最後kubeadm會一鍵部署,僅僅設置開機啓動即可】


部署【初始化】kubernetes Master【Master節點】
kubeadm init \
--apiserver-advertise-address 192.168.88.149 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.13.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

使用kubectl工具,執行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get node

記住:
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.88.149:6443 --token qlzhpw.fy30lar1jiz11xbw --discovery-token-ca-cert-hash sha256:ed2f22c8a4727f7be52a1495b49e52638e1f79107677daf6722dfa009218f2e8

安裝Pod網絡插件【master節點,node節點加入後自動下載】
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看狀況:
kubectl get pods -n kube-system
kubectl get node

將node節點加入網絡【node節點執行】:
kubeadm join 192.168.88.153:6443 --token nrd1eg.xzb1h6nkkazjt5fg --discovery-token-ca-cert-hash sha256:73c8b0c56493929ed8d2a5b7641110df9187641455415eb6240569026bd460c8
kubectl get node

舉例:創建一個nginx的pod
kubectl create deployment nginx --image=nginx
創建service:暴露容器讓外部訪問【--type=NodePort說明創建的是NodePort類型,則通過任意一個NodeIP+Port就可以訪問】:
kubectl expose deployment nginx --port=80 --type=NodePort
查看pod詳情:kubectl get pods,svc -o wide
192.168.88.151:30344
192.168.88.152:30344
192.168.88.153:30344


kubernetes-dashboard安裝
https://blog.csdn.net/weixin_41806245/article/details/89381752
[Kubernetes] 國內獲取 Kubernetes 鏡像的方法
https://blog.csdn.net/shida_csdn/article/details/78480241
https://www.cnblogs.com/fengzhihai/p/9849683.html
主要參考:https://blog.csdn.net/java_zyq/article/details/82178152
驗證:kubectl get pods -n kube-system
kubernetes的webui配置:dashboard
1、下載安裝yaml文件:wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
2、裝備鏡像
3、修改安裝文件
需要給外部暴露端口所以:
# ------------------- Dashboard Service ------------------- #
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001 # 指定對外端口
  selector:
    k8s-app: kubernetes-dashboard


因爲網絡問題需要提前自行裝備鏡像並修改:
# ------------------- Dashboard Deployment ------------------- #
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3

4、創建Dashboard
kubectl apply -y kubernetes-dashboard.yaml
等待查看[kubectl get pods,svc -o wide -n kube-system]dashboard處於running狀態後即可訪問。
此處坑多:尤其是鏡像問題。
1、配置鏡像和倉庫已經下載的鏡像對應不上而導致腳本自行下載不下來而出錯。
2、配置成功後僅僅可以在部署節點利用https+ip+端口方式訪問,不能在宿主機訪問。
3、進入後登陸方式待後續。

5、訪問Dashboard:https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above
訪問有如下三種方式:
1、NodePort【節點主機訪問】
至此就可以使用NodePort訪問Dashboard。可以在部署節點利用https+ip+端口方式訪問,不能在宿主機訪問。
2、kubectl proxy【宿主機】最簡單的方式就是開啓代理方式可以在宿主機訪問:
在Master上執行kubecll proxy,然後使用如下地址訪問Dashboard:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
但限制就是必須在Master上訪問,這顯然是個坑,我們的目標是在我們真實的物理機上去訪問Master的Dashboard。

所以,在主節點上,我們執行kubectl proxy --address=192.168.56.101 --disable-filter=true開啓代理。
顯示如下說明代理開啓:
W0515 09:16:46.963911   27314 proxy.go:140] Request filter disabled, your proxy is vulnerable to XSRF attacks, please be cautious
Starting to serve on 192.168.88.151:8001
其中:
address表示外界可以使用192.168.56.101來訪問Dashboard,我們也可以使用0.0.0.0
disable-filter=true表示禁用請求過濾功能,否則我們的請求會被拒絕,並提示 Forbidden (403) Unauthorized。
我們也可以指定端口,具體請查看kubectl proxy --help
3、apiserver
4、Ingress

6、登陸Dashboard
A、token方式登陸:
創建SA,並綁定默認cluster-admin【k8s的超級管理員】管理員集羣角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
查看剛剛創建dashboard-admin的token信息
kubectl get secret -n kube-system
kubectl describe secret dashboard-admin-token-sprhf -n kube-system
B、點擊跳過使用默認方式登陸:
此時方式登陸之後整個頁面提示:很遺憾,我們看到了很多權限錯誤提示,主要是system:serviceaccount:kube-system:kubernetes-dashboard的權限不足引起的。
因爲權限的問題,所以需要在kubernetes-dashboard.yaml中對默認登陸用戶設置更高權限的角色,
因此,我們可以更改RoleBinding修改爲ClusterRoleBinding,並且修改roleRef中的kind和name,
使用cluster-admin這個非常牛逼的CusterRole(超級用戶權限,其擁有訪問kube-apiserver的所有權限)。如下:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system


當主節點ip發生變化時,重新構建集羣步驟:
1、修改hosts文件【各節點】
2、kubeadm reset 
或者 
嘗試
systemctl stop kubelet;
docker rm -f -v $(docker ps -q);
find /var/lib/kubelet | xargs -n 1 findmnt -n -t tmpfs -o TARGET -T | uniq | xargs -r umount -v;
rm -r -f /etc/kubernetes /var/lib/kubelet /var/lib/etcd;
參考:https://www.colabug.com/596892.html

3、刪除 /root/.kube/ 下文件和目錄
4、docker ps 查看
5、修改--apiserver-advertise-address參數 重新構建
kubeadm init \
--apiserver-advertise-address 192.168.88.153 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.13.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
後續一樣,使用kubectl工具、安裝pod網絡kube-flannel、加入節點


當子節點ip發生變化時,重新構建集羣步驟:
1、修改hosts文件【各節點】
2、kubeadm reset
3、執行更新後的:kubeadm join 192.168.88.153:6443 --token nrd1eg.xzb1h6nkkazjt5fg --discovery-token-ca-cert-hash sha256:73c8b0c56493929ed8d2a5b7641110df9187641455415eb6240569026bd460c8
4、可能會報錯:The connection to the server localhost:8080 was refused - did you specify the right host or port?
解決方法如下:
1、將主節點中的【/etc/kubernetes/admin.conf】文件拷貝到從節點相同目錄下
2、配置環境變量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
立即生效:source ~/.bash_profile


問題:子節點執行kubectl get pods報錯:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
出現這個問題的原因是kubectl命令需要使用kubernetes-admin來運行。
解決方法如下:
1、將主節點中的【/etc/kubernetes/admin.conf】文件拷貝到從節點相同目錄下
2、配置環境變量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
立即生效:source ~/.bash_profile
參考:https://www.jianshu.com/p/6fa06b9bbf6a

kubeadm 續坑篇
https://www.colabug.com/596892.html
https://mritd.me/2016/11/21/kubeadm-other-problems/


kubeadm常用命令:

kubectl:常用操作命令:
創建:kubectl run <name> --image=<image> 或者 kubectl create -f manifest.yaml
查詢:kubectl get <resource>
更新 kubectl set 或者 kubectl patch
刪除:kubectl delete <resource> <name> 或者 kubectl delete -f manifest.yaml
查詢 Pod IP:kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'
查看狀況:
kubectl get pods -n kube-system
kubectl get node
查看pod詳情:
kubectl get pods,svc -o wide
kubectl get node
查看在哪個節點上:kubectl get pods -o wide
查看指定命名空間:kube-system下:kubectl get pods -n kube-system
查看所有命名空間:kubectl get pod --all-namespaces


容器內執行命令:kubectl exec -ti <pod-name> sh
容器日誌:kubectl logs [-f] <pod-name>
導出服務:kubectl expose deploy <name> --port=80
kubectl logs 用於顯示 pod 運行中,容器內程序輸出到標準輸出的內容。跟 docker 的 logs 命令類:kubectl logs nginx
kubectl attach 用於連接到一個正在運行的容器。跟 docker 的 attach 命令類似
kubectl exec 用於在一個正在運行的容器執行命令。跟 docker 的 exec 命令類似。
kubectl exec 123456-7890 date
Options:
  -c, --container='': Container name. If omitted, the first container in the pod will be chosen
  -p, --pod='': Pod name
  -i, --stdin=false: Pass stdin to the container
  -t, --tty=false: Stdin is a TT

kubectl cp 支持從容器中拷貝,或者拷貝文件到容器中
https://feisky.gitbooks.io/kubernetes/components/kubectl.html

待解決問題1:
kubectl logs podname 不起作用
升級內核並配置:https://blog.csdn.net/zcc_heu/article/details/78822551

kubernetes的webui配置:dashboard
1、下載安裝yaml文件:wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
2、裝備鏡像
3、修改安裝文件
需要給外部暴露端口所以:
# ------------------- Dashboard Service ------------------- #
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001 # 指定對外端口
  selector:
    k8s-app: kubernetes-dashboard


因爲網絡問題需要提前自行裝備鏡像並修改:
# ------------------- Dashboard Deployment ------------------- #
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3

4、創建Dashboard
kubectl apply -y kubernetes-dashboard.yaml
等待查看[kubectl get pods,svc -o wide -n kube-system]dashboard處於running狀態後即可訪問。
此處坑多:尤其是鏡像問題。
1、配置鏡像和倉庫已經下載的鏡像對應不上而導致腳本自行下載不下來而出錯。
2、配置成功後僅僅可以在部署節點利用https+ip+端口方式訪問,不能在宿主機訪問。
3、進入後登陸方式待後續。

5、訪問Dashboard:https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above
訪問有如下三種方式:
1、NodePort【節點主機訪問】
至此就可以使用NodePort訪問Dashboard。可以在部署節點利用https+ip+端口方式訪問,不能在宿主機訪問。
2、kubectl proxy【宿主機】最簡單的方式就是開啓代理方式可以在宿主機訪問:
在Master上執行kubecll proxy,然後使用如下地址訪問Dashboard:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
但限制就是必須在Master上訪問,這顯然是個坑,我們的目標是在我們真實的物理機上去訪問Master的Dashboard。

所以,在主節點上,我們執行kubectl proxy --address=192.168.56.101 --disable-filter=true開啓代理。
顯示如下說明代理開啓:
W0515 09:16:46.963911   27314 proxy.go:140] Request filter disabled, your proxy is vulnerable to XSRF attacks, please be cautious
Starting to serve on 192.168.88.151:8001
其中:
address表示外界可以使用192.168.56.101來訪問Dashboard,我們也可以使用0.0.0.0
disable-filter=true表示禁用請求過濾功能,否則我們的請求會被拒絕,並提示 Forbidden (403) Unauthorized。
我們也可以指定端口,具體請查看kubectl proxy --help
3、apiserver
4、Ingress

6、登陸Dashboard
A、token方式登陸:
創建SA,並綁定默認cluster-admin【k8s的超級管理員】管理員集羣角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
查看剛剛創建dashboard-admin的token信息
kubectl get secret -n kube-system
kubectl describe secret dashboard-admin-token-sprhf -n kube-system
B、點擊跳過使用默認方式登陸:
此時方式登陸之後整個頁面提示:很遺憾,我們看到了很多權限錯誤提示,主要是system:serviceaccount:kube-system:kubernetes-dashboard的權限不足引起的。
因爲權限的問題,所以需要在kubernetes-dashboard.yaml中對默認登陸用戶設置更高權限的角色,
因此,我們可以更改RoleBinding修改爲ClusterRoleBinding,並且修改roleRef中的kind和name,
使用cluster-admin這個非常牛逼的CusterRole(超級用戶權限,其擁有訪問kube-apiserver的所有權限)。如下:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

搭建K8S Ingress:https://blog.csdn.net/java_zyq/article/details/82179107


至此

1、創建Dashboard
https://blog.csdn.net/java_zyq/article/details/82178152
http://192.168.88.151:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
kubectl proxy --address=192.168.88.151 --disable-filter=true

2、訪問Dashboard

創建SA,並綁定默認cluster-admin【k8s的超級管理員】管理員集羣角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

查看剛剛創建dashboard-admin的token信息
kubectl get secret -n kube-system
kubectl describe secret dashboard-admin-token-sprhf -n kube-system


 

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