製作自己的docker鏡像併發布到k8s

本篇主要講述如何將自己的程序生成docker鏡像,並且發佈到k8s環境的簡單步驟。在這之前你需要了解基本的docker使用,基本的k8s概念和命令。

  • Step1 編寫代碼
    爲了方便使用之前一篇的代碼,將KV值put到ETC集羣。具體代碼如下:

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "log"
        "time"
    
        "crypto/tls"
        "crypto/x509"
    
        "go.etcd.io/etcd/clientv3"
        "golang.org/x/net/context"
    )
    
    var (
        dialTimeout    = 5 * time.Second
        requestTimeout = 4 * time.Second
        endpoints      = []string{"https://172.17.84.204:2379", "https://172.17.84.205:2379", "https://172.17.84.206:2379"}
    )
    
    func main() {
    
        log.Println("----Start running-----------")
        var etcdCert = "../ca/etcd-client.pem"
        var etcdCertKey = "../ca/etcd-client-key.pem"
        var etcdCa = "../ca/ca.pem"
    
        cert, err := tls.LoadX509KeyPair(etcdCert, etcdCertKey)
        if err != nil {
            log.Fatal("LoadX509KeyPair failed")
            return
        }
    
        caData, err := ioutil.ReadFile(etcdCa)
        if err != nil {
            log.Fatal("ReadFile(etcdCa) failed")
            return
        }
    
        pool := x509.NewCertPool()
        pool.AppendCertsFromPEM(caData)
    
        _tlsConfig := &tls.Config{
            Certificates: []tls.Certificate{cert},
            RootCAs:      pool,
        }
    
        cfg := clientv3.Config{
            Endpoints: endpoints,
            TLS:       _tlsConfig,
        }
    
        cli, err := clientv3.New(cfg)
    
        if err != nil {
            log.Fatal(err)
        }
    
        defer cli.Close()
    
        done := make(chan bool)
    
        key1 := "testkey1"
    
        go func() {
            log.Println("----Start putting value-----------")
            for cnt := 0; cnt < 65535; cnt++ {
                log.Println(cnt)
                value := fmt.Sprintf("%s%d", "value", cnt)
                _, err = cli.Put(context.Background(), key1, value)
                if err != nil {
                    log.Println("Put failed. ", err)
                } else {
                    log.Printf("Put {%s:%s} succeed\n", key1, value)
                }
            }
            done <- true
        }()
    
        <-done
    
        log.Println("Done!")
    }
    

    編譯代碼生成在Linux下的可執行文件

    GOOS=linux GOARCH=amd64 go build
  • Step2 編寫Dockerfile

    FROM alpine:latest
    RUN mkdir /app
    RUN mkdir /ca
    WORKDIR /app
    ADD ./putvalue /app/putvalue
    CMD ["./putvalue"]
  • Step3 生成Docker鏡像
    爲了方便直接將生成的鏡像發到docker hub。請自己去註冊https://hub.docker.com

    (1)執行docker login登陸

    (2)在Dockerfile目錄下執行命令生成docker鏡像

    docker build -t etcdpvimg .

    如果build成功會顯示如下信息
    屏幕快照 2019-10-10 下午5.41.27.png

    (3)打tag,推送到docker hub
    執行命令對生成的鏡像打tag

    docker tag etcdpvimg your_account_xxx/etcdpvimg:latest

    push鏡像到docker hub

    docker push your_account_xxx/etcdpvimg:latest
  • Step4 編寫K8s Deployment部署文件
    因爲訪問ETC需要使用證書,所以使用hosPath在Pod上掛載宿主機上的文件目錄
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: etcd-put-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: etcd-putvalue
  template:
    metadata:
      labels:
        app: etcd-putvalue
    spec:
      volumes:
        - name: cavol
          hostPath:
            path: "/ca"
      containers:
        - name: putvalue-test
          image: your_account_xxx/etcdpvimg:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /root/app/ca
              name: cavol

  • Step5 發佈測試

    執行K8s的apply命令

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