自動添加k8s腳本
1. Mac部署k8s
官網地址: https://www.docker.com/procts/docker-desktop
1:翻牆問題,Docker Desktop默認去國外拉取鏡像,不能翻牆或者翻牆網速慢的小夥伴只能幹著急。推薦一個開源項目: https://github.com/AliyunContainerService/k8s-for-docker-desktop ,作者提供了一個腳本核帆,將從阿里源拉取鏡像到本地,
2:檢查hosts文件,確定大者是否有硬解析:127.0.0.1 kubernetes.docker.internal
默認會自動加,對於用hosts切換工具的小夥伴來說,需要注意一下,否則就會有滾氏薯一下問題:
dial tcp: lookup kubernetes.docker.internal: no such host
部署 Kubernetes dashboard:
檢查 kubernetes-dashboard 應用狀態:
開啟 API Server 訪問代理:
通過如下 URL 訪問 Kubernetes dashboard:
http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
配置控制台訪問令牌:
2. 怎麼在ubuntu上安裝kubernetes
1.部署環境:
(1) Ubuntu 14.04 (2台裝有該版本的筆記本電腦)
(2) Docker 1.9.1
(3) etcd-2.2.5
(4) Kubernetes 0.9.0
2.配置Ubuntu 14.04
(1) 由於只有兩台主機,所以這里一台主機既充當Master又充當minions:
Master(mininos): 192.168.1.101
Mininos: 192.168.1.100
(2) 創建/opt/bin文件夾,後面安裝會用:sudo mkdir -p /opt/bin
3.在Master主機上安裝etcd-2.2.5
(1)下載: https://github.com/coreos/etcd/releases/download/v2.2.5/etcd-v2.2.5-linux-amd64.tar.gz
(2) 解壓文件: tar -zxvf etcd-v2.2.5-linux-amd64.tar.gz
(3)復制etcd到/opt/bin文件夾中: cp etcd-v2.2.5-linux-amd64/etcd /opt/bin/
4.在Master主機中安裝Kubernetes 0.9.0(假設安裝目錄為/home/docker/Downloads)
(1) 下載:https://github.com/kubernetes/kubernetes/releases/download/v0.9.0/kubernetes.tar.gz
(2) 解壓kubernetes.tar.gz文件: tar -zxvf /home/docker/Downloads/kubernetes.tar.gz
(3) 進入kubernetes/server目錄下: cd /home/docker/Downloads/kubernetes/server
(4) 解壓kubernetes-server-linux-amd64.tar.gz文件得到kubernetes:tar -zxvf /home/docker/Downloads/kubernetes-server-linux-amd64.tar.gz
(5)進入kubernetes/server/bin/目錄下:cd /home/docker/Downloads/kubernetes/server/kubernetes/server/bin/
(6)復制該目錄下所有的文件到/opt/bin/目錄下: sudo cp * /opt/bin/
(7)進入到/home/docker/Downloads/kubernetes/cluster/ubuntu目錄下: cd /home/docker/Downloads/kubernetes/cluster/ubuntu
(8)執行./util.sh腳本: sudo ./util.sh(該腳本檢測/opt/bin/下的相關文件,自動安裝kubernetes)
(9)安裝完成後可以發現到/etc/default/,/etc/init/,/etc/init.d/目錄下多了etcd和kubernetes相關的配置文件和啟動文件
5.在Minions上安裝kubernetes:(Mininos上不用安裝etcd)
在Minions上只需要安裝kubelet,kube-proxy即可.安裝方法與Master上的安裝步驟一樣,只是安裝完成後將/etc/default,/etc/init/,/etc/init.d/文件夾下的與kube-apiserver,kube-controller-manager,kube-scheler相關的文件刪除即可.
6.etcd配置:
(1)修改/etc/default/etcd:
# Etcd Upstart and SysVinit configuration file
# Customize etcd location
# ETCD="/opt/bin/etcd"
# Use ETCD_OPTS to modify the start/restart options
ETCD_OPTS="-listen-client-urls=http://192.168.1.101:4001"
# Add more envionrment settings used by etcd here
(2)刪除/etc/init/etcd.conf與/etc/init.d/etcd
7.kubernetes相關配置:
(1).Master節點:
/etc/default/kube-apiserver
# Kube-Apiserver Upstart and SysVinit configuration file
# Customize kube-apiserver binary location
# KUBE_APISERVER="/opt/bin/kube-apiserver"
# Use KUBE_APISERVER_OPTS to modify the start/restart options
KUBE_APISERVER_OPTS="--address=127.0.0.1 \
--port=8080 \
--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true \
--portal_net=11.1.1.0/24"
# Add more envionrment settings used by kube-apiserver here
/etc/default/ kube-controller-manager
# Kube-Controller-Manager Upstart and SysVinit configuration file
# Customize kube-controller-manager binary location
# KUBE_CONTROLLER_MANAGER="/opt/bin/kube-controller-manager"
# Use KUBE_CONTROLLER_MANAGER_OPTS to modify the start/restart options
KUBE_CONTROLLER_MANAGER_OPTS="--master=127.0.0.1:8080 \
--machines=127.0.0.1,192.168.1.100 \
--logtostderr=true"
# Add more envionrment settings used by kube-controller-manager here
/etc/default/kubelet
# Kubelet Upstart and SysVinit configuration file
# Customize kubelet binary location
# KUBELET="/opt/bin/kubelet"
# Use KUBELET_OPTS to modify the start/restart options
KUBELET_OPTS="--address=127.0.0.1 \
--port=10250 \
--hostname_override=127.0.0.1 \
--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"
# Add more envionrment settings used by kube-scheler here
/etc/default/kube-proxy
# Kube-Proxy Upstart and SysVinit configuration file
# Customize kube-proxy binary location
# KUBE_PROXY="/opt/bin/kube-proxy"
# Use KUBE_PROXY_OPTS to modify the start/restart options
KUBE_PROXY_OPTS="--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"<pre name="code" class="plain">
# Add more envionrment settings used by kube-apiserver here
/etc/default/kube-scheler
# Kube-Scheler Upstart and SysVinit configuration file
# Customize kube-apiserver binary location
# KUBE_SCHEDULER="/opt/bin/kube-apiserver"
# Use KUBE_SCHEDULER_OPTS to modify the start/restart options
KUBE_SCHEDULER_OPTS="--logtostderr=true \
--master=127.0.0.1:8080"
# Add more envionrment settings used by kube-scheler here
(2)Minions節點
/etc/default/kubelet
# Kubelet Upstart and SysVinit configuration file
# Customize kubelet binary location
# KUBELET="/opt/bin/kubelet"
# Use KUBELET_OPTS to modify the start/restart options
KUBELET_OPTS="--address=0.0.0.0 \
--port=10250 \
--hostname_override=192.168.1.100 \
--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"
# Add more envionrment settings used by kube-scheler here
/etc/default/kube-proxy
# Kube-Proxy Upstart and SysVinit configuration file
# Customize kube-proxy binary location
# KUBE_PROXY="/opt/bin/kube-proxy"
# Use KUBE_PROXY_OPTS to modify the start/restart options
KUBE_PROXY_OPTS="--etcd_servers=http://192.168.1.101:4001 \
--logtostderr=true"
# Add more envionrment settings used by kube-apiserver here
8.啟動相關服務
Master 節點:
(1).啟動docker服務
sudo service docker start
(2).啟動etcd服務
sudo etcd -name etcdserver -peer-addr 192.168.1.101:7001 -addr 192.168.1.101:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001 &
(3)啟動kubernetes相關服務
sudo service kube-apiserver start
sudo service kube-controller-manager start
sudo service kubelet start
sudo service kube-proxy start
sudo service kube-scheler start
Minions節點:
啟動kuberbetes相關服務
sudo service kubelet start
sudo service kube-proxy start
9.打開相關埠
Master節點: 打開4001,7001埠
iptables -I INPUT -s 192.168.43.0/24 -p tcp --dport 4001 -j ACCEPT
iptables -I INPUT -s 192.168.43.0/24 -p tcp --dport 7001 -j ACCEPT
Minions節點:打開10250埠
iptables -I INPUT -s 192.168.43.0/24 -p tcp --dport 10250 -j ACCEPT
3. Centos7.6安裝k8s(kubadmin高可用)
對5台機器分別修改,同時修改hosts文件
1.1.2修改其它的主機名
所有主機操作
本文的k8s網路使用flannel,該網路需要設置內核參數bridge-nf-call-iptables=1,修改這個參數需要系統有br_netfilter模塊。
查看br_netfilter模塊:
如果系統沒有br_netfilter模塊則執行下面的新增命令,如有則忽略。
臨時新增br_netfilter模塊:
永久新增br_netfilter模塊:
永久修改
在桐氏所有機器上都添加以下源
所有伺服器均安裝
查看docker版本
安裝docker
在三台master主機上都需要安裝keepalived
所有機器全部安裝
kubelet 運行在集群所有節點上,用於啟動Pod和容器等對象的工具
kubeadm 用於初始化集群,啟動集群的命令工具
kubectl 用於和集群通信的命令行,通過kubectl可以部署和管理應用,查看各種資源,創建、刪除和更新各種組件
安裝版本為最新 1.22.2
也可以根據自己所需要的版本來局腔散安裝部署
查看版本
安裝yum install -y kubelet kubeadm kubectl
啟動kubelet並設置開機啟動
初始化失敗,或出現以下錯誤,可以重新初始化
如果初始化失敗,可執行kubeadm reset後重新初始化
記錄kubeadm join的輸圓埋出,後面需要這個命令將work節點和其他master節點加入集群中。
master01分發證書:
在master01上運行腳本cert-main-master.sh,將證書分發至master02和master03
同時執行
同時執行
work01加入集群
work02加入集群
如果出現worker節點名字沒改,後面添加有問題,按以下執行則可以後續添加
CNI網路插件
先關閉master01
查看master02
正常轉移。
k8s高可用部署完畢
4. skywalking—docker鏡像構建k8s部署
前言
skywalking是個非常不錯的apm產帆閉品,但是在使用過程中有個非常蛋疼的問題,在基於es的存儲情況下,es的數據一有問題,就會導致整個skywalking web ui服務不可用,然後需要agent端一個服務一個服虧汪務的停用,然後服務重新部署後好,全部走一遍。這種問題同樣也會存在skywalking的版本升級迭代中。而且apm 這種過程數據是允許丟棄的,默認skywalking中關於trace的數據記錄只保存了90分鍾。故博主准備將skywalking的部署容器化,一鍵部署升級。下文是整個skywalking 容器化部署的過程。
目標:將skywalking的docker鏡像運行在k8s的集群環境中提供服務
docker鏡像構建
FROMregistry.cn-xx.xx.com/keking/jdk:1.8ADDapache-skywalking-apm-incubating/ /opt/apache-skywalking-apm-incubating/RUNln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \
&& chmod +x /opt/apache-skywalking-apm-incubating/config/setApplicationEnv.sh \
&& chmod +x /opt/apache-skywalking-apm-incubating/webapp/setWebAppEnv.sh \
&& chmod +x /opt/apache-skywalking-apm-incubating/bin/startup.sh \
&& echo "tail -fn 100 /opt/apache-skywalking-apm-incubating/logs/webapp.log" >> /opt/apache-skywalking-apm-incubating/bin/startup.shEXPOSE8080 10800 11800 12800CMD/opt/apache-skywalking-apm-incubating/態空裂config/setApplicationEnv.sh \
&& sh /opt/apache-skywalking-apm-incubating/webapp/setWebAppEnv.sh \
&& /opt/apache-skywalking-apm-incubating/bin/startup.sh
在編寫Dockerfile時需要考慮幾個問題:skywalking中哪些配置需要動態配置(運行時設置)?怎麼保證進程一直運行(skywalking 的startup.sh和tomcat中 的startup.sh類似)?
application.yml
#cluster:# zookeeper:# hostPort: localhost:2181# sessionTimeout: 100000naming:jetty:#OS real network IP(binding required), for agent to find collector clusterhost:0.0.0.0port:10800contextPath:/cache:# guava:caffeine:remote:gRPC:# OS real network IP(binding required), for collector nodes communicate with each other in cluster. collectorN --(gRPC) --> collectorMhost:#real_hostport:11800agent_gRPC:gRPC:#os real network ip(binding required), for agent to uplink data(trace/metrics) to collector. agent--(grpc)--> collectorhost:#real_hostport:11800# Set these two setting to open ssl#sslCertChainFile: $path#sslPrivateKeyFile: $path# Set your own token to active auth#authentication: xxxxxxagent_jetty:jetty:# OS real network IP(binding required), for agent to uplink data(trace/metrics) to collector through HTTP. agent--(HTTP)--> collector# SkyWalking native java/.Net/node.js agents don't use this.# Open this for other implementor.host:0.0.0.0port:12800contextPath:/analysis_register:default:analysis_jvm:default:analysis_segment_parser:default:bufferFilePath:../buffer/bufferOffsetMaxFileSize:10MbufferSegmentMaxFileSize::trueui:jetty:# Stay in `localhost` if UI starts up in default mode.# Change it to OS real network IP(binding required), if deploy collector in different machine.host:0.0.0.0port:12800contextPath:/storage:elasticsearch:clusterName:#elasticsearch_:trueclusterNodes:#elasticsearch_clusterNodesindexShardsNumber:2indexReplicasNumber:0highPerformanceMode:true# Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.htmlbulkActions:2000# Execute the bulk every 2000 requestsbulkSize:20# flush the bulk every 20mbflushInterval:10# flush the bulk every 10 seconds whatever the number of requestsconcurrentRequests:2# the number of concurrent requests# Set a timeout on metric data. After the timeout has expired, the metric data will automatically be deleted.traceDataTTL:2880# Unit is minuteminuteMetricDataTTL:90# Unit is minutehourMetricDataTTL:36# Unit is hourdayMetricDataTTL:45# Unit is daymonthMetricDataTTL:18# Unit is month#storage:# h2:# url: jdbc:h2:~/memorydb# userName: saconfiguration:default:#namespace: xxxxx# alarm :2000serviceErrorRateThreshold:10.::10.::10.:2000# ::40# max collection's size of worker cache collection, setting it smaller when collector OutOfMemory crashed.workerCacheMaxSize:10000#receiver_zipkin:# default:# host: localhost# port: 9411# contextPath: /
webapp.yml
動態配置:密碼,grpc等需要綁定主機的ip都需要運行時設置,這里我們在啟動skywalking的startup.sh只之前,先執行了兩個設置配置的腳本,通過k8s在運行時設置的環境變數來替換需要動態配置的參數
setApplicationEnv.sh
#!/usr/bin/env shsed -i"s/#elasticsearch_clusterNodes/${elasticsearch_clusterNodes}/g"/opt/apache-skywalking-apm-incubating/config/application.ymlsed -i"s/#elasticsearch_clusterName/${elasticsearch_clusterName}/g"/opt/apache-skywalking-apm-incubating/config/application.ymlsed -i"s/#real_host/${real_host}/g"/opt/apache-skywalking-apm-incubating/config/application.yml
setWebAppEnv.sh
#!/usr/bin/env shsed -i"s/#skywalking_password/${skywalking_password}/g"/opt/apache-skywalking-apm-incubating/webapp/webapp.ymlsed -i"s/#real_host/${real_host}/g"/opt/apache-skywalking-apm-incubating/webapp/webapp.yml
保持進程存在:通過在skywalking 啟動腳本startup.sh末尾追加"tail -fn 100
/opt/apache-skywalking-apm-incubating/logs/webapp.log",來讓進程保持運行,並不斷輸出webapp.log的日誌
Kubernetes中部署
apiVersion:extensions/v1beta1kind:Deploymentmetadata:name:skywalkingnamespace:uatspec:replicas:1selector:matchLabels:app:skywalkingtemplate:metadata:labels:app:skywalkingspec:imagePullSecrets:-name:registry-pull-secretnodeSelector:apm:skywalkingcontainers:-name:skywalkingimage:registry.cn-xx.xx.com/keking/kk-skywalking:5.2imagePullPolicy:Alwaysenv:-name:elasticsearch_clusterNamevalue:elasticsearch-name:elasticsearch_clusterNodesvalue:172.16.16.129:31300-name:skywalking_passwordvalue:xxx-name:real_hostvalueFrom:fieldRef:fieldPath:status.podIPresources:limits:cpu:1000mmemory:4Girequests:cpu:700mmemory:2Gi---apiVersion:v1kind:Servicemetadata:name:skywalkingnamespace:uatlabels:app:skywalkingspec:selector:app:skywalkingports:-name:web-aport:8080targetPort:8080nodePort:31180-name:web-bport:10800targetPort:10800nodePort:31181-name:web-cport:11800targetPort:11800nodePort:31182-name:web-dport:12800targetPort:12800nodePort:31183type:NodePort
Kubernetes部署腳本中唯一需要注意的就是env中關於pod ip的獲取,skywalking中有幾個ip必須綁定容器的真實ip,這個地方可以通過環境變數設置到容器裡面去
結語
整個skywalking容器化部署從測試到可用大概耗時1天,其中花了個多小時整了下譚兄的skywalking-docker鏡像(
https://hub.docker.com/r/wutang/skywalking-docker/),發現有個腳本有許可權問題(譚兄反饋已解決,還沒來的及測試),以及有幾個地方自己不是很好控制,便build了自己的docker鏡像,其中最大的問題還是解決集群中網路通訊的問題,一開始我把skywalking中的服務ip都設置為0.0.0.0,然後通過集群的nodePort映射出來,這個時候的agent通過集群ip+31181是可以訪問到naming服務的,然後通過naming服務獲取到的collector gRPC服務缺變成了0.0.0.0:11800, 這個地址agent肯定訪問不到collector的,後面通過綁定pod ip的方式解決了這個問題。
5. 使用 k3s 在 Fedora IoT 上運行 K8S
Fedora IoT 是一個即將發布的、面向物聯網的 Fedora 版本。去年 Fedora Magazine 的《 如何使用 Fedora IoT 點亮 LED 燈 》一文第一次介紹了它。從那以後,它與 Fedora Silverblue 一起不斷改進,以提供針對面向容器的工作流的不可變基礎操作系統。
Kubernetes 是一個頗受歡迎的容器編排系統。它可能最常用在那些能夠處理巨大負載的強勁硬體上。不過,它也能在像樹莓派 3 這樣輕量級的設備上運行。讓我們繼續閱讀,來了解如何運行它。
雖然 Kubernetes 在雲計算領域風靡一時,但讓它在小型單板機上運行可能並不是常見的。不過,我們有非常明確的理由來做這件事。首先,這是一個不需要昂貴硬體就可以學習並熟悉 Kubernetes 的好方法;其次,由於它的流行性,市面上有 大量應用 進行了預先打包,以用於在 Kubernetes 集群中運行。更不用說,當你遇到問題時,會有大規模的社區用戶為你提供幫助。
最後但同樣重要的是,即使是在家庭實驗室這樣的小規模環境中,容器編排也確實能夠使事情變得更加簡單。雖然在學習曲線方面,這一點並不明顯,但這些技能在你將來與任何集群打交道的時候都會有幫助。不管你面對的是一個單節點樹莓派集群,還是一個大規模的機器學習場,它們的操作方式都是類似的。
一個「正常」安裝的 Kubernetes(如果有這么一說的話)對於物聯網來說有點沉重。K8s 的推薦內存配置,是每台機器 2GB!不過,我們也有一些替代品,其中一個新人是 k3s —— 一個輕量級的 Kubernetes 發行版。
K3s 非常特殊,因為它將 etcd 替換成了 SQLite 以滿足鍵值存儲需求。還有一點,在於整個 k3s 將使用一個二進制文件分發,而不是每個組件一個。這減少了內存佔用並簡化了安裝過程。基於上述原因,我們只需要 512MB 內存即可運行 k3s,極度適合小型單板電腦!
安裝 k3s 非常簡單。直接運行安裝腳本:
它會下載、安裝並啟動 k3s。安裝完成後,運行以下命令來從伺服器獲取節點列表:
需要注意的是,有幾個選項可以通過環境變數傳遞給安裝腳本。這些選項可以在 文檔 中找到。當然,你也完全可以直接下載二進制文件來手動安裝 k3s。
對於實驗和學習來說,這樣已經很棒了,不過單節點的集群也不能算一個集群。幸運的是,添加另一個節點並不比設置第一個節點要難。只需要向安裝腳本傳遞兩個環境變數,它就可以找到第一個節點,而不用運行 k3s 的伺服器部分。
上面的 example-url 應被替換為第一個節點的 IP 地址,或一個完全限定域名。在該節點中,(用 XXX 表示的)令牌可以在 /var/lib/rancher/k3s/server/node-token 文件中找到。
現在我們有了一個 Kubernetes 集群,我們可以真正做些什麼呢?讓我們從部署一個簡單的 Web 伺服器開始吧。
這會從名為 nginx 的容器鏡像中創建出一個名叫 my-server 的 部署 (默認使用 docker hub 注冊中心,以及 latest 標簽)。
為了訪問到 pod 中運行的 nginx 伺服器,首先通過一個 服務 來暴露該部署。以下命令將創建一個與該部署同名的服務。
服務將作為一種負載均衡器和 Pod 的 DNS 記錄來工作。比如,當運行第二個 Pod 時,我們只需指定 my-server(服務名稱)就可以通過 curl 訪問 nginx 伺服器。有關如何操作,可以看下面的實例。
默認狀態下,一個服務只能獲得一個 ClusterIP(只能從集群內部訪問),但你也可以通過把它的類型設置為 LoadBalancer 為該服務申請一個外部 IP。不過,並非所有應用都需要自己的 IP 地址。相反,通常可以通過基於 Host 請求頭部或請求路徑進行路由,從而使多個服務共享一個 IP 地址。你可以在 Kubernetes 使用 Ingress 完成此操作,而這也是我們要做的。Ingress 也提供了額外的功能,比如無需配置應用即可對流量進行 TLS 加密。
Kubernetes 需要 Ingress 控制器來使 Ingress 資源工作,k3s 包含 Traefik 正是出於此目的。它還包含了一個簡單的服務負載均衡器,可以為集群中的服務提供外部 IP。這篇 文檔 描述了這種服務:
Ingress 控制器已經通過這個負載均衡器暴露在外。你可以使用以下命令找到它正在使用的 IP 地址。
找到名為 traefik 的服務。在上面的例子中,我們感興趣的 IP 是 10.0.0.8。
讓我們創建一個 Ingress,使它通過基於 Host 頭部的路由規則將請求路由至我們的伺服器。這個例子中我們使用 xip.io 來避免必要的 DNS 記錄配置工作。它的工作原理是將 IP 地址作為子域包含,以使用 10.0.0.8.xip.io 的任何子域來達到 IP 10.0.0.8。換句話說,my-server.10.0.0.8.xip.io 被用於訪問集群中的 Ingress 控制器。你現在就可以嘗試(使用你自己的 IP,而不是 10.0.0.8)。如果沒有 Ingress,你應該會訪問到「默認後端」,只是一個寫著「404 page not found」的頁面。
我們可以使用以下 Ingress 讓 Ingress 控制器將請求路由到我們的 Web 伺服器的服務。
將以上片段保存到 my-ingress.yaml 文件中,然後運行以下命令將其加入集群:
你現在應該能夠在你選擇的完全限定域名中訪問到 nginx 的默認歡迎頁面了。在我的例子中,它是 my-server.10.0.0.8.xip.io。Ingress 控制器會通過 Ingress 中包含的信息來路由請求。對 my-server.10.0.0.8.xip.io 的請求將被路由到 Ingress 中定義為 backend 的服務和埠(在本例中為 my-server 和 80)。
想像如下場景:你的家或農場周圍有很多的設備。它是一個具有各種硬體功能、感測器和執行器的物聯網設備的異構集合。也許某些設備擁有攝像頭、天氣或光線感測器。其它設備可能會被連接起來,用來控制通風、燈光、百葉窗或閃爍的 LED。
這種情況下,你想從所有感測器中收集數據,在最終使用它來制定決策和控制執行器之前,也可能會對其進行處理和分析。除此之外,你可能還想配置一個儀表盤來可視化那些正在發生的事情。那麼 Kubernetes 如何幫助我們來管理這樣的事情呢?我們怎麼保證 Pod 在合適的設備上運行?
簡單的答案就是「標簽」。你可以根據功能來標記節點,如下所示:
一旦它們被打上標簽,我們就可以輕松地使用 nodeSelector 為你的工作負載選擇合適的節點。拼圖的最後一塊:如果你想在所有合適的節點上運行 Pod,那應該使用 DaemonSet 而不是部署。換句話說,應為每個使用唯一感測器的數據收集應用程序創建一個 DaemonSet,並使用 nodeSelector 確保它們僅在具有適當硬體的節點上運行。
服務發現功能允許 Pod 通過服務名稱來尋找彼此,這項功能使得這類分布式系統的管理工作變得易如反掌。你不需要為應用配置 IP 地址或自定義埠,也不需要知道它們。相反,它們可以通過集群中的命名服務輕松找到彼此。
隨著集群的啟動並運行,收集數據並控制燈光和氣候,可能使你覺得你已經把它完成了。不過,集群中還有大量的計算資源可以用於其它項目。這才是 Kubernetes 真正出彩的地方。
你不必擔心這些資源的確切位置,或者去計算是否有足夠的內存來容納額外的應用程序。這正是編排系統所解決的問題!你可以輕松地在集群中部署更多的應用,讓 Kubernetes 來找出適合運行它們的位置(或是否適合運行它們)。
為什麼不運行一個你自己的 NextCloud 實例呢?或者運行 gitea ?你還可以為你所有的物聯網容器設置一套 CI/CD 流水線。畢竟,如果你可以在集群中進行本地構建,為什麼還要在主計算機上構建並交叉編譯它們呢?
這里的要點是,Kubernetes 可以更容易地利用那些你可能浪費掉的「隱藏」資源。Kubernetes 根據可用資源和容錯處理規則來調度 Pod,因此你也無需手動完成這些工作。但是,為了幫助 Kubernetes 做出合理的決定,你絕對應該為你的工作負載添加 資源請求 配置。
盡管 Kuberenetes 或一般的容器編排平台通常不會與物聯網相關聯,但在管理分布式系統時,使用一個編排系統肯定是有意義的。你不僅可以使用統一的方式來處理多樣化和異構的設備,還可以簡化它們的通信方式。此外,Kubernetes 還可以更好地對閑置資源加以利用。
容器技術使構建「隨處運行」應用的想法成為可能。現在,Kubernetes 可以更輕松地來負責「隨處」的部分。作為構建一切的不可變基礎,我們使用 Fedora IoT。
via: https://fedoramagazine.org/kubernetes-on-fedora-iot-with-k3s/
作者: Lennart Jern 選題: lujun9972 譯者: StdioA 校對: wxy
6. win10下docker開通k8s教程
一、Docker For Windows Stable在Enable Kubernetes這個問題上是有Bug的,建議切換襪腔到Edge版本
二、為了更快的完成一些安裝,我們先通過告悉衫一個阿里雲的批處理,提前把Kubernetes需要的Images拉取下來,在powershell執行如下:
git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git
cd k8s-for-docker-desktop
.\load_images.ps1
無法載入文件 .ps1,因為在此系統中禁止執行腳本
以管理員身份運行powershell
執行
set-executionpolicy remotesigned
輸入y即可
三、切換Settings到Kubernetes,勾選開啟項進行安裝,這個過程可能比較久。
四、獲取所有的上下文。
kubectl config get-contexts
五、切換Kubernetes運行上下文至 docker-desktop (之前版本的 context 為 docker-for-desktop)
kubectl config use-context docker-desktop
六、驗證 Kubernetes 集群狀態
kubectl cluster-info
kubectl get nodes
七、配置 Kubernetes 控制台
部署 Kubernetes dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
或
kubectl create -f kubernetes-dashboard.yaml
檢查 kubernetes-dashboard 應用狀態
kubectl get pod -n kubernetes-dashboard
開啟 API Server 訪問代理
kubectl proxy
通過如下 URL 訪問 Kubernetes dashboard
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
八、配置控制台訪問令牌
$TOKEN=((kubectl-n kube-system describe secret default|Select-String "token:")-split "+")[1]kubectl config set-credentials docker-for-desktop --token="${TOKEN}"
echo $TOKEN
輸入token即可登錄
或者
新打開一個cmd,cd到kubernetes路徑
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
復制最後一個token輸入上陸搏面即可
7. K8S 應用啟停通用腳本
Kubernetes 集群中缺頃運行的應用中的每一個服務組件通常是以 Deployment 的形式存在的,本文中提供的管理腳本假設讀者部署在 Kubernetes 中的應用服務的 Deployment 對象均已特定的前綴命名,比如 demo,那麼集群中可能存在一下的 Deployment 對象:
在這個前提下,我這里提供了者模一個腳本可以對這些 deployment 對象進行一鍵啟停操作。舉例說明,加絨我的腳本名稱為 k8s-apps.sh 那麼可以執行如下命令:
啟停腳本的內容如下:伏嫌陸
8. 二進制安裝K8S(基於1.19.16版本)
通過kubeadmin安裝K8S集群可以做到快速部署,但是如果需要調整K8S各個組件及服務的安昌昌全配置,高可用模式,最好通過二進制模式進行K8S的安裝
生產環境K8S Master節點最好在3個節點以上,且配置不低於4核16g
生產環境:確保Master高可用,啟用安全訪問機制
PS:
伺服器節點只是起名字,與是否為k8s-master或k8s-node無關,可根據需要增加或刪減測試用例的數量,如多台master主機只部署k8s-master組件。多台node主機只部署k8s-node組件
master1 192.168.100.100
node1 192.168.100.101
node2 192.168.100.102
註:雹迅襪本節中創建的證書為部署流程全過程證書,測試用例為openssl生成證書,cfssl生成證書需要參考cfssl生成k8s證書,並在對應配置文件的相關證書位置替換對應證書
在配置文件中需要在[alt_names]設置Master服務的全部域名和IP地址,包括:
參數解析
配置文件詳解:
分發配置文件
配置文件詳解:
配置詳解
分發配置文件
分發配置文件
在三個kube-apiserver的前段部署HAProxy和keepalived,使用VIP(虛擬IP地址)192.168.100.200作為Master的唯一入口地址,供客戶端訪問
將HAProxy和keepalived均部署為至少有兩個實例的高可用架構,以避免單點故障。
接下來在主機master(192.168.100.100)和主機node1(192.168.100.101)中部署
HAProxy負責將客戶端請求轉發到後端的3個kube-apiserver實例上,keepalived負責維護VIP的高可用
准備 HAProxy 的配置文件 haproxy.cfg
參數說明:
分發配置文件
在master(192.168.100.100)和node1(192.168.100.101)上使用docker部署HAProxy,並將配置文件掛載到容器的/usr/local/etc/haproxy下
訪問192.168.100.100:8888/stats,192.168.100.101:8888/stats
keepalived用於維護VIP地址的高可用,同樣在master和node1中部署
主節點配置文件
子節點配置文件
參數解析
主節點和子節點配置異同
健康檢查腳本
keeplived需要持續監控HAProxy的運行狀態,在某個節點運行不正常時轉移到另外的節點上去
監控運行狀態需要創建健康檢查腳本,定期運行監控
腳本內容如下:
分發腳本
在master(192.168.100.100)和node1(192.168.100.101)上使用docker部署keeplived,並將配置文件掛載到容器的/container/service/keepalived/assets下,將腳本掛載到源激容器的/usr/bin下
檢查ens33網卡是否存在keeplived VIP地址
檢測keeplived是否進行轉發
註:master集群已經配置完畢,後續需要在node中需要部署docker,kubelet,kube-proxy,且在加入k8s集群後,還需要部署CNI網路插件、DNS插件等
之前已經在master,node1,node2中部署了docker,接下來需要部署其他服務組件,本節部署kubelet組件
參數說明
參數說明
參數說明
當前顯示所有node為NOT READY,需要部署完網路插件才可使用
為方便使用kubectl
9. 分享一些實用的k8s腳本
去年惡補k8s,產生一些成果物,在此念運分享。
k8s集蠢拍群安裝nfs-utils
k8s集群rinted安裝
k8s部署tomcat
k8s映射仔檔梁tomcat服務
k8s創建pv
k8s創建pvc