暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

通过demo让kubernetes跑起来

码不禁言 2020-02-11
572

导读

kubernetes(简称k8s)使开发者可以自主部署应用,并且控制部署的频率,完全脱离运维团队的帮助。更多的概念请参考相关书籍,本文通过一个简单的demo让http服务在k8s环境下跑起来,面向入门用户。

写一个最简单的http demo

鉴于golang在部署方面的简单和无依赖性,本文的demo通过golang来实现,功能很简单,代码如下:

    // main.go
    package main


    import (
    "fmt"
    "net/http"
    )


    func IndexHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "hello k8s")
    }


    func main() {
    http.HandleFunc("/", IndexHandler)
    http.ListenAndServe(":8888", nil)
    }


    编译

    编译注意事项:(1)由于最终打包的docker镜像是linux系统,本地编译go应用的时候需要指定GOOS参数。(2)如果本地没有golang环境,可以通过golang docker对源码进行编译。(3)可以将编译和构建镜像一起实现,参考后面构建镜像的说明

      # makefile
      all:
      go build -o httpdemo ./*.go


      linux:
      CGO_ENABLED=0 GOOS=linux go build -o httpdemo ./*.go


      compile:
      sudo docker run --rm -v $(shell pwd):/usr/src/httpdemo -w usr/src/httpdemo golang:1.13 go build -tags netgo -o httpdemo

      build:
      sudo docker build -t "3072tech/httpdemo" .


      compile-build:
      sudo docker build -t "3072tech/httpdemo" -f Dockerfile2 .


      构建镜像

      这里用了空scratch做基础镜像,能够最大化节省镜像空间,也体现了golang在docker化方面的优势

        # dockerfile
        FROM scratch
        WORKDIR /home/service/
        COPY ./httpdemo ./
        EXPOSE 8888
        ENTRYPOINT ["./httpdemo"]

        可以将编译和构建放在一个dockerfile文件里头一起实现,如下:

          # dockerfile2
          FROM golang:1.13 AS builder
          WORKDIR /home/service/
          COPY . .
          RUN CGO_ENABLED=0 GOOS=linux go build -tags netgo -o httpdemo


          FROM scratch
          WORKDIR /home/service/
          COPY --from=builder home/service/httpdemo ./
          EXPOSE 8888
          ENTRYPOINT ["./httpdemo"]

          注:笔者已经将该demo镜像推送到docker hub,可以直接通过docker pull 3072tech/httpdemo拉取。


          通过Pod跑起来

          这里假设大家已经有一套可用的k8s环境(如何搭建k8s环境请自己google),我们先从最简单的pod进行应用的部署,pod是k8s运行应用的最小单位,容器被放在pod中运行。pod资源文件的描述如下:

            # httpdemo-pod.yaml
            apiVersion: v1
            kind: Pod
            metadata:
            name: httpdemo
            spec:
            containers:
            - image: 3072tech/httpdemo
            name: httpdemo
            ports:
            - containerPort: 8888
            protocol: TCP

            让pod跑起来 kubectrl create -f ./httpdemo-pod.yaml


            通过ReplicationController跑起来

            k8s通过各种controller来管理资源,之前创建的pod如果挂掉了则服务不可用,这里通过ReplicationController对pod副本进行管理,比如这里保证以上pod的副本保持在3个。

              # httpdemo-rc.yaml
              apiVersion: v1
              kind: ReplicationController
              metadata:
              name: httpdemo
              spec:
              replicas: 3
              template:
              metadata:
              labels:
              app: httpdemo
              spec:
              containers:
              - name: httpdemo
              image: 3072tech/httpdemo
              ports:
              - containerPort: 8888

              注:新版本推荐用ReplicaSet,而不是ReplicationController实际生产环境Deployment便于服务升级而不是直接rs或rc。


              通过Service和Dns访问

              前面我们通过访问pod的ip来调用http接口,但pod是不可靠的,可能重启或者挂掉,通过pod ip访问不可行。这里引入service的概念,通过service可以暴露一个单一不变的IP地址让外部的客户端连接pod。service的资源文件如下:

                # httpdemo-svc.yaml
                apiVersion: v1
                kind: Service
                metadata:
                name: httpdemo
                spec:
                ports:
                - port: 80
                targetPort: 8888
                selector:
                app: httpdemo

                通过service暴露的cluster-ip我们可以用一个虚拟ip来访问到内部的pod,而不会受限于pod ip的变更。但实际生产中直接通过ip进行访问通信也不是很现实,k8s提供了kube-dns模块,可以通过dns对服务进行访问,如下:

                  [parallels@ks17master k8s]$ kubectl run busybox --rm -it --image=busybox /bin/sh
                  If you don't see a command prompt, try pressing enter.
                  / # wget http://httpdemo
                  Connecting to httpdemo (10.104.144.146:80)
                  saving to 'index.html'
                  index.html 100% |********************************************************************************************************************************************************************************************************************************| 10 0:00:00 ETA
                  'index.html' saved
                  / # cat index.html
                  hello k8s


                  总结

                  本文通过一个简单的demo演示了如何通过k8s来搭建应用,但这里并没有涉及到实际使用的方方面面,比如升级和回滚、比如服务探测、自动扩容缩容等,后面会考虑进一步深入探讨。读者也可以自己查找资料学习,推荐《kubernets in action》这本书,已经有中文版。

                  文章转载自码不禁言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论