kubeadm安裝Kubernetes實(shí)踐過程,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、和平ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的和平網(wǎng)站制作公司
這里以1.9.3為例:
1.10.x版本安裝參考:https://my.oschina.net/u/2306127/blog/1806263
國(guó)內(nèi)1.10.2,https://www.cnblogs.com/RainingNight/archive/2018/05/02/8975838.html
贈(zèng)人玫瑰,手有余香。本文來源-https://my.oschina.net/u/2306127/blog/1628082
環(huán)境:
主機(jī)使用MacOS+VirtualBox,虛擬機(jī)為Ubuntu Desktop 16.04.4,網(wǎng)絡(luò)設(shè)為橋接。
kubernetes版本為1.9.3,docker-ce使用17.03.0(后來升級(jí)到docker-ce 18.02,也可以正常運(yùn)行)。
注意:
kubeadm還在快速發(fā)展、演化之中,遇到問題可以查看官網(wǎng)的最新信息(https://kubernetes.io/docs/setup/independent/install-kubeadm/)
遇到問題,可以先搜索https://github.com/kubernetes/kubernetes/issues。
或者到 github.com/kubernetes 上反饋,提交issue,幫助改進(jìn)。
shell腳本和工具下載,https://github.com/openthings/kubernetes-tools。
Kubernetes是一個(gè)強(qiáng)大的容器治理平臺(tái)。不過對(duì)于一個(gè)可以管理大規(guī)模集群的系統(tǒng),安裝起來也并非易事。而且由于原始的Kubernetes相關(guān)Docker鏡像和安裝文件都托管在gcloud上,鏈接指向也都是無法訪問的,因此手工操作是不可避免的。再加之Kubernetes本身也在快速的發(fā)展,各種坑和不同版本的差異讓成功運(yùn)行Kubernetes難度更大。
最簡(jiǎn)單的方式是使用minikube(參見:https://my.oschina.net/u/2306127/blog/1621468)或者Docker for Mac/Windows(參見:https://my.oschina.net/u/2306127/blog/1606599),但這只能在開發(fā)環(huán)境下使用(用于桌面級(jí)服務(wù)也很有用),不支持多機(jī)集群和多節(jié)點(diǎn)的規(guī)模伸縮。
Kubernetes的Dockerhub鏡像,https://hub.docker.com/r/mirrorgooglecontainers
Kubeadm的具體使用參考,https://my.oschina.net/u/2306127/blog/1627651
kubeadm是一個(gè)kubernetes的安裝工具,可以用于快速部署kubernets集群,但上面的問題依然存在,我們可以將鏡像從dockerhub上先拉下來,再改成需要的名稱。在這之前,目前版本還需要有一些小的手工設(shè)置(目前版本Kubernetes基礎(chǔ)服務(wù)已經(jīng)全部容器化了,以后版本安裝過程可能都全部自動(dòng)化了),如下:
由于目前版本兼容性限制,在Ubuntu上需要調(diào)整幾個(gè)設(shè)置:
臨時(shí)關(guān)閉,運(yùn)行:swapoff -a。下次啟動(dòng)還有。
到/etc/fstab中永久刪除或關(guān)閉swap分區(qū),使用 # 注釋掉即可。
下面的命令將清除現(xiàn)有的所有防火墻規(guī)則:
iptables -F
確保kubelet使用的cgroup driver 與 Docker的一致。要么使用下面的方法更新 Docker:
cat << EOF > /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } EOF
要么,設(shè)置kubernetes的cgroup driver,如:kubelet 的 --cgroup-driver
標(biāo)志設(shè)置為與 Docker 一樣(e.g. cgroupfs
)。
目前的Kubernetes 1.9.3驗(yàn)證的docker版本最高為CE 17.03,使用下面的方法安裝:
apt-get update apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - add-apt-repository \ "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \ $(lsb_release -cs) \ stable" apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')
apt-cache madison docker-ce可以查看可用的版本。
!apt-get代理的單獨(dú)設(shè)置。
Apt-get有時(shí)候無法訪問,設(shè)了系統(tǒng)代理也不行。可以嘗試單獨(dú)設(shè)置apt的代理,如下:
$ nano /etc/apt/apt.conf Acquire::http::Proxy "http://192.168.199.99:9999"; Acquire::https::Proxy "http://192.168.199.99:9999";
或者在執(zhí)行時(shí)加上-E參數(shù)(指示apt使用環(huán)境變量),如下所示(參考:https://askubuntu.com/questions/257290/configure-proxy-for-apt):
sudo -E https_proxy=192.168.199.99:9999 apt install docker-ce=17.03.2~ce-0~ubuntu-xenial
不要更新,否則docker會(huì)被更新到最新的版本。可以嘗試最新版本,是可以運(yùn)行的。
!參照如下格式設(shè)置docker的獨(dú)立代理,清除所有系統(tǒng)代理(因?yàn)镵ubernetes要訪問本地服務(wù))。
編輯docker服務(wù)的配置文件,然后重新啟動(dòng)/etc/systemd/system/docker.service。
詳細(xì)說明 https://my.oschina.net/u/2306127/blog/1627620 。
運(yùn)行 sudo gedit /lib/systemd/system/docker.service,加入設(shè)置如下:
Environment="HTTP_PROXY=http://192.168.199.99:9999/" Environment="HTTPS_PROXY=http://192.168.199.99:9999/" Environment="NO_PROXY=localhost,127.0.0.0/8"
但是,在安裝時(shí)還是遇到奇慢無比的情況,只能多嘗試一下。
Kubernetes的原始docker鏡像在gcloud上,即使使用代理也需要注冊(cè)、登錄,使用gcloud工具才能獲取,使用docker會(huì)導(dǎo)致莫名其妙的失?。ǔ鲥e(cuò)信息含糊)。可以從DockerHub上面拉取Kubernetes鏡像的復(fù)制品,然后修改docker的名稱(以后可以通過kubeadm的配置文件來安裝,應(yīng)該就可以指定安裝源了)。
腳本如下,如果需要其它的容器鏡像可以照此增加即可,可以將版本號(hào)修改為自己需要的。
注意:kubernetes每個(gè)版本依賴的版本不同,下面適用1.9.3。
echo "==================================================" echo "Set proxy to http://192.168.199.99:9999..." echo "" export http_proxy=http://192.168.199.99:9999 export https_proxy=http://192.168.199.99:9999 echo "==================================================" echo "" echo "Pulling Docker Images from mirrorgooglecontainers..." echo "==>kube-apiserver:" docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.9.3 docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.9.3 gcr.io/google_containers/kube-apiserver-amd64:v1.9.3 echo "==>kube-controller-manager:" docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.9.3 docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.9.3 gcr.io/google_containers/kube-controller-manager-amd64:v1.9.3 echo "==>kube-scheduler:" docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.9.3 docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.9.3 gcr.io/google_containers/kube-scheduler-amd64:v1.9.3 echo "==>kube-proxy:" docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.9.3 docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.9.3 gcr.io/google_containers/kube-proxy-amd64:v1.9.3 echo "==>k8s-DNS-sidecar:" docker pull mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.8 docker tag mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.8 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.8 echo "==>k8s-dns-kube-dns:" docker pull mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.8 docker tag mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.8 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.8 echo "==>k8s-dns-dnsmasq-nanny:" docker pull mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.8 docker tag mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.8 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.8 echo "==>etcd:" docker pull mirrorgooglecontainers/etcd-amd64:3.1.11 docker tag mirrorgooglecontainers/etcd-amd64:3.1.11 gcr.io/google_containers/etcd-amd64:3.1.11 echo "==>pause:" docker pull mirrorgooglecontainers/pause-amd64:3.0 docker tag mirrorgooglecontainers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0 echo finished. echo "More update, please visit: https://hub.docker.com/r/mirrorgooglecontainers" echo ""
建議將上面內(nèi)容保存到getkubeimage.sh,然后運(yùn)行即可。如下:
gedit getkubeimages.sh #復(fù)制、黏貼上面的腳本內(nèi)容。 sudo chmod +x getkubeimages.sh sudo ./getkubeimages.sh
kubeadm是用于kubernetes安裝、維護(hù)的命令行工具。
echo "添加Kubernetes安裝源認(rèn)證key:" sudo curl -sSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add echo "添加Kubernetes安裝源:" sudo echo “deb http://apt.kubernetes.io/ kubernetes-xenial main” > /etc/apt/sources.list.d/kubernetes.list echo "更新系統(tǒng)軟件包列表:" sudo apt update echo "查看Kubernetes的可用版本:" apt-cache madison kubeadm echo "安裝kubeadm 1.9.3: " apt-get install -y kubeadm=1.9.3-00
對(duì)于kubeadm 1.9.3版本。將下面的內(nèi)容添加到 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 文件。
[Service] Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd" Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
以及將 KUBELET_CGROUP_ARGS加到啟動(dòng)參數(shù)中(該參數(shù)在本版本安裝文件中丟失)。
最后 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 文件如下:
[Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true" Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin" Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local" Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt" Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0" Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki" Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd" Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false" ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_CGROUP_ARGS $KUBELET_EXTRA_ARGS
systemctl daemon-reload systemctl restart kubelet
可以使用 sudo systemctl status kubelet查看kubelet服務(wù)的狀態(tài)。
kubeadm init --kubernetes-version=v1.9.3 --pod-network-cidr=192.168.0.0/16
或者:
kubeadm init --kubernetes-version=v1.9.3 –pod-network-cidr 10.244.0.0/16
Using CoreDNS, add:
kubeadm init --kubernetes-version=v1.9.3 –pod-network-cidr 10.244.0.0/16 --feature-gates CoreDNS=true
使用Kubeadm安裝的具體命令參考 https://my.oschina.net/u/2306127/blog/1627651。
添加節(jié)點(diǎn)
記住上面返回值的添加節(jié)點(diǎn)命令,到其他節(jié)點(diǎn)上執(zhí)行即可。
如果忘記了,重新獲取上面的命令,運(yùn)行:
kubeadm token create --print-join-command --ttl 0
可以使用kubeadm token -h 查看token操作。
重新生成CA授權(quán)碼:
#openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
參見討論:https://github.com/kubernetes/kubeadm/issues/26
按照上面完成后的提示執(zhí)行:
sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#查看日志: kubectl get pods --namespace kube-system kubectl --namespace kube-system logs kube-flannel-ds-bvxd2 #上面的kube-flannel-ds-bvxd2為flannel的pod名稱,根據(jù)get pods返回的名稱輸入。 #編輯 /etc/kubernetes/manifests/kube-controller-manager.yaml 在command節(jié),加入: - --allocate-node-cidrs=true - --cluster-cidr=10.244.0.0/16 然后system restart kubelet即可。
該問題解決辦法的詳細(xì)參考:https://github.com/coreos/flannel/issues/728
默認(rèn)設(shè)置主控節(jié)點(diǎn)不開啟任務(wù)節(jié)點(diǎn)功能,可以通過命令打開,從而將主控和任務(wù)節(jié)點(diǎn)部署到一臺(tái)機(jī)器上。
kubectl taint nodes --all node-role.kubernetes.io/master-
使用kubeadm join命令將其它任務(wù)節(jié)點(diǎn)加入主控集群。
kubeadm join –token 8dc9d8.df09161bed020a12 192.168.199.106:6443 –discovery-token-ca-cert-hash sha256:16exxx
如果安裝失敗,使用 kubeadm reset 重置安裝環(huán)境。大部分時(shí)候需要重啟操作系統(tǒng)再行運(yùn)行kubeadm init,因?yàn)橐恍┫到y(tǒng)網(wǎng)絡(luò)服務(wù)端口已經(jīng)被占用了,而且無法簡(jiǎn)單地清除。
注意:如果改變了代理設(shè)置,需要將控制臺(tái)窗口關(guān)閉,然后再重新打開。否則,Ubuntu系統(tǒng)的“設(shè)置”->“網(wǎng)絡(luò)”->“代理”設(shè)置對(duì)話框改變的是全局環(huán)境變量http_proxy和https_proxy沒有清除,仍然是有效的,導(dǎo)致本地服務(wù)連接不上。這也是一些服務(wù)如apt/node.js/github(代理設(shè)置參考 https://my.oschina.net/u/2306127/blog/869727)沒有使用這些環(huán)境變量,導(dǎo)致雖然進(jìn)行了操作系統(tǒng)設(shè)置但是仍然無效的原因所在。
Kubernetes安裝成功,輸出信息如下所示:
root@kube:/home/supermap# kubeadm init --kubernetes-version v1.9.3 --pod-network-cidr=10.244.0.0/16[init] Using Kubernetes version: v1.9.3 [init] Using Authorization modes: [Node RBAC] [preflight] Running pre-flight checks. [WARNING FileExisting-crictl]: crictl not found in system path [preflight] Starting the kubelet service [certificates] Generated ca certificate and key. [certificates] Generated apiserver certificate and key. [certificates] apiserver serving cert is signed for DNS names [kube kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.199.111] [certificates] Generated apiserver-kubelet-client certificate and key. [certificates] Generated sa key and public key. [certificates] Generated front-proxy-ca certificate and key. [certificates] Generated front-proxy-client certificate and key. [certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki" [kubeconfig] Wrote KubeConfig file to disk: "admin.conf" [kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf" [kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf" [kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf" [controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml" [controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml" [controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml" [etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml" [init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests". [init] This might take a minute or longer if the control plane images have to be pulled. [apiclient] All control plane components are healthy after 33.501916 seconds [uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [markmaster] Will mark node kube as master by adding a label and a taint [markmaster] Master kube tainted and labelled with key/value: node-role.kubernetes.io/master="" [bootstraptoken] Using token: 8b2ed3.149a349e4b775985 [bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials [bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token [bootstraptoken] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace [addons] Applied essential addon: kube-dns [addons] Applied essential addon: kube-proxy Your Kubernetes master has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join --token 8b2ed3.149a349e4b775985 192.168.199.111:6443 --discovery-token-ca-cert-hash sha256:ab69621f2117f2b283df725859724efc71c37a20f6da519237ca1dad5a72d9b2
后續(xù)操作,執(zhí)行:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后運(yùn)行 kubectl get ns 獲取命名空間(namespaces)的信息,輸出如下:
supermap@kube:~$ kubectl get ns NAME STATUS AGE default Active 22m kube-public Active 22m kube-system Active 22m
把本機(jī)作為任務(wù)節(jié)點(diǎn)加入:
kubectl taint nodes --all node-role.kubernetes.io/master-
查看節(jié)點(diǎn)情況:
supermap@kube:~$ kubectl get node NAME STATUS ROLES AGE VERSION kube NotReady master 28m v1.9.3
現(xiàn)在,本機(jī)同時(shí)運(yùn)行了主控和一個(gè)任務(wù)節(jié)點(diǎn)。
查看節(jié)點(diǎn)詳細(xì)情況:
#顯示pods列表。 kubectl get pods --namespace=kube-system -o wide #得到pod的詳細(xì)信息,其中kube-dns-6f4fd4bdf-895jh為節(jié)點(diǎn)名稱。 kubectl get -o json --namespace=kube-system pods/kube-dns-6f4fd4bdf-895jh
后續(xù)安裝dns、dashboard、helm時(shí)還需要下面幾個(gè)鏡像,架上代理拉下來,或者到hub.docker.com上找到pull下來,在docker tag成相應(yīng)的名字,否則kubectl get pods會(huì)顯示一直處于pending狀態(tài)。
docker pull quay.io/coreos/flannel:v0.10.0-amd64 docker pull gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.7 docker pull k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3 docker pull gcr.io/kubernetes-helm/tiller:v2.8.1
參考:
Kubernetes Dashboard面板服務(wù)安裝,https://my.oschina.net/u/2306127/blog/1606599
dashboard安裝授權(quán)登錄詳細(xì)參考,https://my.oschina.net/u/2306127/blog/1630861
Helm軟件包管理服務(wù)安裝,https://my.oschina.net/u/2306127/blog/1619818
映射dashboard的端口,讓外面可以訪問:
kubectl port-forward kubernetes-dashboard-7798c48646-wkgk4 8443:8443 --namespace=kube-system &
注意,kubernetes-dashboard-7798c48646-wkgk4是kubectl get pods --namespace=kube-system -o wide列出的dashboard的pod名稱。
dashboard在使用kubeadm安裝的系統(tǒng)上授權(quán)還有些問題,詳細(xì)參考:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/#deploying-the-dashboard-ui
現(xiàn)在,可以打開瀏覽器,輸入 http://localhost:8443查看kubernetes的運(yùn)行情況。
大功告成。
看完上述內(nèi)容,你們掌握kubeadm安裝Kubernetes實(shí)踐過程的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
本文標(biāo)題:kubeadm安裝Kubernetes實(shí)踐過程
分享URL:http://jinyejixie.com/article8/podpip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、品牌網(wǎng)站制作、Google、網(wǎng)站建設(shè)、網(wǎng)站制作、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)