摘要:手動(dòng)搭建集群探索系列的第三篇,主要記錄手動(dòng)搭建集群的過(guò)程,部署部署用作服務(wù)發(fā)現(xiàn)。配置的子網(wǎng)范圍不能和的一致。
手動(dòng)搭建kubernetes集群
配置環(huán)境探索kubernetes系列的第三篇,主要記錄手動(dòng)搭建k8s集群的過(guò)程,部署dashboard, 部署DNS用作服務(wù)發(fā)現(xiàn)。順便記錄一下k8s中的一些資源的概念。
這個(gè)步驟可以參考《Flannel with Docker》文中的步驟,不想贅述了。用了 centos/7 這個(gè)鏡像,需要多做一點(diǎn)工作。
安裝 Guest Additionsvagrant plugin install vagrant-vbguest ,這時(shí)在 Vagrantfile 中不要設(shè)置目錄映射, 添加以下配置
config.vbguest.auto_update = false # do NOT download the iso file from a webserver config.vbguest.no_remote = true
vagrant up
vagrant vbguest
這時(shí)會(huì)自動(dòng)安裝 Guest Additions, 再關(guān)閉vm,配置上目錄映射,再up,就可以了. 家里的網(wǎng)絡(luò)連接 centos 官方的源,速度還行, 可以不用改成國(guó)內(nèi)源。
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak wget http://mirrors.163.com/.help/CentOS7-Base-163.repo -O CentOS-Base.repo mv CentOS-Base.repo /etc/yum.repos.d/ sudo yum makecache sudo yum updateInstall Docker
sudo tee /etc/yum.repos.d/docker.repo <<-"EOF" [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF sudo yum install docker-engine sudo systemctl enable docker.service sudo systemctl start docker
配置 http_proxy, 這步極為重要,一些必要的鏡像要從谷歌的源下載, 感謝萬(wàn)惡的GWF:
vim /lib/systemd/system/docker.service 在[Service]中添加:
EnvironmentFile=-/etc/docker/docker.conf
這里的 減號(hào) 表示如果文件不存在,則忽略錯(cuò)誤
vim /etc/docker/docker.conf 添加:
http_proxy=192.168.0.2:7777 https_proxy=192.168.0.2:7777 no_proxy=localhost,127.0.0.1,192.168.0.2
重啟 dockerd
Start etcdetcd --listen-client-urls "http://0.0.0.0:2379,http://0.0.0.0:4001" --advertise-client-urls "http://192.168.0.2:2379,http://192.168.0.2:4001" > /dev/null 2>&1 &
Install Kubernetes去 github release page 下載最新的版本. 大約 1G.
Start Master啟動(dòng) apiserver
hyperkube apiserver --address=0.0.0.0 --etcd_servers=http://192.168.0.2:2379 --service-cluster-ip-range=10.10.0.0/16 --v=0 >apiserver.log 2>&1 &
啟動(dòng) controller-manager
hyperkube controller-manager --master=127.0.0.1:8080 --logtostderr=true >cm.log 2>&1 &
日志有有報(bào)錯(cuò),pem 文件找不到,可能和下面這兩個(gè)配置有關(guān),需要搜索 --cluster-signing-cert-file string Filename containing a PEM-encoded X509 CA certificate used to issue cluster-scoped certificates (default "/etc/kubernetes/ca/ca.pem") --cluster-signing-key-file string Filename containing a PEM-encoded RSA or ECDSA private key used to sign cluster-scoped certificates (default "/etc/kubernetes/ca/ca.key")
hyperkube scheduler --master=127.0.0.1:8080 > scheduler.log 2>&1 &
提示 Could not construct reference... due to: "selfLink was empty, can"t make reference"Start Node
啟動(dòng) proxy:
hyperkube proxy --master=192.168.0.2:8080 --logtostderr=true >proxy.log 2>&1 &
安裝DNS的部分有提到,kubelet 要添加兩個(gè)啟動(dòng)參數(shù), 完整的啟動(dòng)命令為:
hyperkube kubelet --api_servers=192.168.0.2:8080 --address=0.0.0.0 --hostname_override=bq-node1 --healthz-bind-address=0.0.0.0 --logtostderr=true --cluster-dns=10.10.0.10 --cluster-domain=cluster.local >kubelet.log 2>&1 &
基本操作建議走一遍官網(wǎng)的 tutorial, 基本能了解常用的 資源類型, 我在github的倉(cāng)庫(kù)做了筆記,可以參考我的 筆記
Dashboard在 kubernetes-src/cluster/addons/dashboard 中有 yaml 文件,使用 kubectl create -f dashboard.yaml 即可創(chuàng)建 dashboard deployment.
啟動(dòng) dashboard 的之前,需要 打開一段注釋,args: - --apiserver-host=http://192.168.0.2:8080,
否則 dashboard 無(wú)法啟動(dòng)
kubectl describe pods/kubernetes-dashboard-3985220203-j043h --namespace=kube-system 看到event信息報(bào)錯(cuò), 啟動(dòng)其他 image 的時(shí)候也有這個(gè)錯(cuò),需要查找, MissingClusterDNS, kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
kubelet log顯示 CPUAccounting not allowed ,
這個(gè)問(wèn)題估計(jì)是 systemd 控制的
啟動(dòng)后界面如下:
進(jìn)入 kubernetes/cluster/addons/dns/ 目錄, 需要使用到 skydns-rc.yaml.in, skydns-svc.yaml.in, 這兩個(gè)文件。
rc 需要替換的變量:
replica = 1
dns_domain = cluster.local
kube-dns 啟動(dòng)參數(shù)需要指定 master 的接口
args: # command = "/kube-dns" - --kube-master-url=http://192.168.0.2:8080
svc 需要替換的變量:
dns_server = 10.10.0.10 // 這個(gè)ip需要在 apiserver 的啟動(dòng)參數(shù)--service-cluster-ip-range設(shè)置的ip段 里面,隨意定義一個(gè).
用kubectl create -f 啟動(dòng) rc , svc.
kubelet 啟動(dòng)參數(shù)需要加入 --cluster-dns=10.10.0.10 --cluster-domain=cluster.local
完整的啟動(dòng)命令為:
hyperkube kubelet --api_servers=192.168.0.2:8080 --address=0.0.0.0 --hostname_override=bq-node1 --healthz-bind-address=0.0.0.0 --logtostderr=true --cluster-dns=10.10.0.10 --cluster-domain=cluster.local >kubelet.log 2>&1 &
觀察啟動(dòng)結(jié)果:
kubectl get rc --namespace=kube-system kubectl get svc --namespace=kube-system
最后在 node機(jī) 上測(cè)試 DNS:
dig @10 .10.0.10 hello.default.svc.cluster.local
;; ANSWER SECTION: hello.default.svc.cluster.local. 30 IN A 10.10.83.26
這里 hello 是 之前起的一個(gè)deploy,配置文件如下。建議還是分開兩個(gè)文件寫,hello-service.yaml, hello-deploy.yaml
kind: Service apiVersion: v1 metadata: labels: app: hello name: hello spec: ports: - port: 9090 selector: run: hello --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello spec: replicas: 1 template: metadata: labels: run: hello spec: containers: - name: hello image: silentred/alpine-hello:v1 ports: - containerPort: 9090
如果想升級(jí) image:
kubectl set image deploy/hello hello=silentred/alpine-hello:v2
其實(shí)還有更好的辦法: kubectl replace -f , 后面會(huì)提到.
這里有一個(gè)點(diǎn)需要注意:
只有service會(huì)被注冊(cè)到 kube-dns 中,按照上面的service的定義,每個(gè)類型的服務(wù)都需要?jiǎng)?chuàng)建一個(gè)service, 因此每個(gè)類型的服務(wù)都會(huì)創(chuàng)建一個(gè) clusterIP,clusterIP 的 backends 就是 EndPoints 的服務(wù),默認(rèn)是 round-robin 輪詢。
這樣雖然省事,但是clusterIP在任意node節(jié)點(diǎn)上都是可以訪問(wèn)的,有些內(nèi)部的RPC只希望在集群container內(nèi)部訪問(wèn),而不想暴露到外部。還有有些服務(wù),就只起一個(gè)實(shí)例, --replicas永遠(yuǎn)為1,那么就不需要再分配一個(gè) clusterIP了, 減少耦合。 這樣的話,可以使用 Headless Service, 就是把 spec.clusterIP 設(shè)為 None, 這樣就不會(huì)給service分配clusterIP, 如果使用了 selector, dns里查到的就是容器的ip。
詳情看文檔
進(jìn)入容器內(nèi)部:
docker exec -it CONTAINER_ID bash // resolv.conf 的內(nèi)容,估計(jì)是 dns 插件自動(dòng)生成的 bash-4.4# cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local pek2.qingcloud.com. nameserver 10.10.0.10 options ndots:5
安裝完kube-dns插件后,在容器內(nèi)部使用DNS查找到的ip為該 service 的 clusterIP, 在容器內(nèi)部ping自身的name(hello)可以看到解析出來(lái)的ip, 但是ping的包全部丟失了,文檔解釋是只支持 tcp/udp 通信。 doc
這表示,在程序中直接使用 dial("default.svc.cluster.local"), 就能通過(guò) service 去輪詢各個(gè) container, 可以不用實(shí)現(xiàn) grpc 的 LB 策略了。
如果使用了 Headless Service, 那么就必須保證容器間的網(wǎng)絡(luò)連通,可以采用 flannel。
flannel 配置的子網(wǎng)范圍 不能和 apiserver 的 clusterIP 一致。
用于容器鏡像和配置文件之間的解耦, 可以用 kubectl create configmaps 來(lái)創(chuàng)建,也可以用yaml來(lái)創(chuàng)建,貼一個(gè)文檔上的例子:
apiVersion: v1 data: game.properties: |- enemies=aliens lives=3 ui.properties: | color.good=purple color.bad=yellow kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:34:05Z name: game-config namespace: default resourceVersion: "407"- selfLink: /api/v1/namespaces/default/configmaps/game-config uid: 30944725-d66e-11e5-8cd0-68f728db1985
在容器中使用有多種方式:
1 定義為環(huán)境變量,下面有例子,定義了環(huán)境變量,還可以用作啟動(dòng)參數(shù)
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type restartPolicy: Never
2 作為volume使用,mount到鏡像的指定目錄:
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "cat /etc/config/special.how" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config restartPolicy: Never測(cè)試
定義一個(gè) ConfigMap:
kind: ConfigMap apiVersion: v1 metadata: creationTimestamp: 2016-02-18T19:14:38Z name: my-config namespace: default data: example.foo: bar example.long_file: |- test.1=value-1 test.2=value-2
修改 hello-deploy.yaml:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello spec: replicas: 1 template: metadata: labels: run: hello spec: containers: - name: hello image: silentred/alpine-hello:v2 ports: - containerPort: 9090 env: - name: CONFIG_FOO valueFrom: configMapKeyRef: name: my-config key: example.foo
替換原來(lái)的deployment, kubectl replace -f hello-deploy.yaml, 在運(yùn)行這個(gè)命令之前可以在 node 機(jī)上 用 docker ps 觀察一下 hello container的 id, 運(yùn)行后在看一下,會(huì)發(fā)現(xiàn)兩者是不一樣的,說(shuō)明container 重啟了。
這時(shí),再次進(jìn)入 hello container 內(nèi)部,env | grep FOO 可以看到效果。
bash-4.4# env | grep FOO CONFIG_FOO=barSecret
和 configmap 類似,只是 value 是 base64 encoded. 創(chuàng)建:
apiVersion: v1 data: password: MWYyZDFlMmU2N2Rm username: YWRtaW4= kind: Secret metadata: creationTimestamp: 2016-01-22T18:41:56Z name: mysecret namespace: default resourceVersion: "164619" selfLink: /api/v1/namespaces/default/secrets/mysecret uid: cfee02d6-c137-11e5-8d73-42010af00002 type: Opaque
同樣可以選擇 mount 到 path或者 環(huán)境變量:
apiVersion: v1 kind: Pod metadata: name: secret-env-pod spec: containers: - name: mycontainer image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password restartPolicy: NeverimagePullSecrets
在從私有registry 拉取鏡像時(shí),可以用 secret 來(lái)設(shè)定 username, password, 參考文檔
限制對(duì)于依賴secret 的pod,必須先設(shè)定secret
secret跨namespace不可見
單個(gè)secret 1MB 大小限制
kubelets只支持從API server 創(chuàng)建的pod使用 secret. 不支持通過(guò) kubelets --manifest-url, --config 創(chuàng)建的pod // 需要查下有什么區(qū)別
對(duì)于第一點(diǎn):pod在被創(chuàng)建前,不會(huì)檢查 secret是否存在,當(dāng)pod被調(diào)度創(chuàng)建時(shí),會(huì)先去apiserver取secret,如果失敗(網(wǎng)絡(luò),不存在)則會(huì)重復(fù)嘗試,直到得到secret,并mount成功。
Ingress可以看做是把服務(wù)暴露給外網(wǎng)的配置,借用文檔中的圖:
internet | [ Ingress ] --|-----|-- [ Services ]
舉個(gè)例子
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: s1 servicePort: 80 - path: /bar backend: serviceName: s2 servicePort: 80 $ kubectl get ing NAME RULE BACKEND ADDRESS test - foo.bar.com /foo s1:80 /bar s2:80
backend 就是service name 和 port.
這只是配置,必須運(yùn)行相應(yīng)的 Ingress Controller Pod, 才有效果,有幾個(gè)現(xiàn)成的controller,
github
其中一個(gè)比較簡(jiǎn)單的例子就是 controller 不停 query ingress 配置,發(fā)現(xiàn)有變化就更新conf配置,再reload nginx,從而實(shí)現(xiàn)反向代理.
DaemonSet 能保證在每個(gè)node上都運(yùn)行一個(gè)pod。比如存儲(chǔ)集群 ceph, 日志收集 fluentd, 節(jié)點(diǎn)監(jiān)控 node_exporter(prometheus), 等 都適用這種策略。
幾種替代方案:
init腳本,例如 systemd等
pods, 指定pod運(yùn)行在某臺(tái)機(jī)器上
static pods, kubelet 可以watch某個(gè)目錄,運(yùn)行其中定義的pod,這些pod不受apiserver調(diào)度。
比較一下 DaemonSet 和 ReplicationController:
Use a replication controller for stateless services, like frontends, where scaling up and down the number of replicas and rolling out updates are more important than controlling exactly which host the pod runs on. Use a Daemon Controller when it is important that a copy of a pod always run on all or certain hosts, and when it needs to start before other pods. rc適用于無(wú)狀態(tài)服務(wù),scaling up/down, rolling out update,pods和node之間沒有固定的關(guān)系 daemon set 適用于 pods和node之間關(guān)系固定的場(chǎng)景,并且需要在其他pod之前存在。ReplicaSet
待續(xù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/32507.html
摘要:宋體自年被開源以來(lái),很快便成為了容器編排領(lǐng)域的標(biāo)準(zhǔn)。宋體年月,樂(lè)心醫(yī)療的第一個(gè)生產(chǎn)用集群正式上線。所以于年推出后,樂(lè)心醫(yī)療的運(yùn)維團(tuán)隊(duì)在開會(huì)討論之后一致決定盡快遷移到。Kubernetes 自 2014 年被 Google 開源以來(lái),很快便成為了容器編排領(lǐng)域的標(biāo)準(zhǔn)。因其支持自動(dòng)化部署、大規(guī)模可伸縮和容器化管理等天然優(yōu)勢(shì),已經(jīng)被廣泛接納。但由于 Kubernetes 本身的復(fù)雜性,也讓很多企業(yè)的...
摘要:有些人將其稱為容器編排平臺(tái),而并非唯一的此類平臺(tái)。但是在中,您可以快速擴(kuò)展出多個(gè)實(shí)例你看看使用擴(kuò)展你的網(wǎng)站是何其便捷。當(dāng)你指向群集的地址和節(jié)點(diǎn)的端口號(hào)時(shí),你就已經(jīng)可見瀏覽器中正在運(yùn)行的程序了。 showImg(https://segmentfault.com/img/remote/1460000017838786?w=1120&h=757); Laravel 是開發(fā) PHP 應(yīng)用程序的...
摘要:核心概念思維導(dǎo)圖集群搭建單節(jié)點(diǎn)單機(jī)版補(bǔ)充之前設(shè)置關(guān)閉報(bào)錯(cuò)多節(jié)點(diǎn)準(zhǔn)備工作修改主機(jī)名請(qǐng)手動(dòng)重啟一下重啟系統(tǒng)安裝切換源鏡像加速添加私有倉(cāng)庫(kù)這里指定版本 k8s 核心概念思維導(dǎo)圖 showImg(https://segmentfault.com/img/bVbjqgv?w=1643&h=884); 集群搭建 單節(jié)點(diǎn) https://my.oschina.net/u/731542/blog/29...
摘要:核心概念思維導(dǎo)圖集群搭建單節(jié)點(diǎn)單機(jī)版補(bǔ)充之前設(shè)置關(guān)閉報(bào)錯(cuò)多節(jié)點(diǎn)準(zhǔn)備工作修改主機(jī)名請(qǐng)手動(dòng)重啟一下重啟系統(tǒng)安裝切換源鏡像加速添加私有倉(cāng)庫(kù)這里指定版本 k8s 核心概念思維導(dǎo)圖 showImg(https://segmentfault.com/img/bVbjqgv?w=1643&h=884); 集群搭建 單節(jié)點(diǎn) https://my.oschina.net/u/731542/blog/29...
摘要:將用戶命令通過(guò)接口傳送給,從而進(jìn)行資源的增刪改等操作。要使用編寫應(yīng)用程序,當(dāng)下大多語(yǔ)言都可以很方便地去實(shí)現(xiàn)請(qǐng)求來(lái)操作的接口從而控制和查詢資源,但本文主要是利用已有的客戶端來(lái)更加優(yōu)雅地實(shí)現(xiàn)的資源控制。 showImg(https://segmentfault.com/img/remote/1460000013517345); 【利用K8S技術(shù)棧打造個(gè)人私有云系列文章目錄】 利用K8S...
閱讀 3640·2023-04-26 02:07
閱讀 3150·2021-09-22 15:55
閱讀 2534·2021-07-26 23:38
閱讀 3119·2019-08-29 15:16
閱讀 2008·2019-08-29 11:16
閱讀 1746·2019-08-29 11:00
閱讀 3583·2019-08-26 18:36
閱讀 3165·2019-08-26 13:32