国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

手動(dòng)搭建kubernetes集群

warnerwu / 2442人閱讀

摘要:手動(dòng)搭建集群探索系列的第三篇,主要記錄手動(dòng)搭建集群的過(guò)程,部署部署用作服務(wù)發(fā)現(xiàn)。配置的子網(wǎng)范圍不能和的一致。

手動(dòng)搭建kubernetes集群

探索kubernetes系列的第三篇,主要記錄手動(dòng)搭建k8s集群的過(guò)程,部署dashboard, 部署DNS用作服務(wù)發(fā)現(xiàn)。順便記錄一下k8s中的一些資源的概念。

配置環(huán)境

這個(gè)步驟可以參考《Flannel with Docker》文中的步驟,不想贅述了。用了 centos/7 這個(gè)鏡像,需要多做一點(diǎn)工作。

安裝 Guest Additions

vagrant 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)源。

國(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 update
Install 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 etcd

etcd --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)后界面如下:

安裝 skyDNS

進(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。
詳情看文檔

服務(wù)發(fā)現(xiàn)

進(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 策略了。

結(jié)合 Flannel

如果使用了 Headless Service, 那么就必須保證容器間的網(wǎng)絡(luò)連通,可以采用 flannel。
flannel 配置的子網(wǎng)范圍 不能和 apiserver 的 clusterIP 一致。

資源類型 ConfigMap

用于容器鏡像和配置文件之間的解耦, 可以用 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=bar
Secret

和 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: Never
imagePullSecrets

在從私有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

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

相關(guān)文章

  • 樂(lè)心醫(yī)療的 Kubernetes云平臺(tái)建設(shè)實(shí)踐

    摘要:宋體自年被開源以來(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è)的...

    testHs 評(píng)論0 收藏0
  • 使用 Kubernetes 來(lái)部署你的 Laravel 程序

    摘要:有些人將其稱為容器編排平臺(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)用程序的...

    JowayYoung 評(píng)論0 收藏0
  • k8s 概念梳理 搭建集群 基本操作

    摘要:核心概念思維導(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...

    ccj659 評(píng)論0 收藏0
  • k8s 概念梳理 搭建集群 基本操作

    摘要:核心概念思維導(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...

    darcrand 評(píng)論0 收藏0
  • 利用K8S技術(shù)棧打造個(gè)人私有云(連載之:K8S資源控制)

    摘要:將用戶命令通過(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...

    Reducto 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<