Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lab2_answer #31

Open
sweetpotatoman opened this issue Dec 30, 2019 · 0 comments
Open

lab2_answer #31

sweetpotatoman opened this issue Dec 30, 2019 · 0 comments

Comments

@sweetpotatoman
Copy link

lab2-application-and-service

  1. 学习 kubectl proxy 命令及其含义。回答如何通过 proxy 访问 kubernetes 集群?

    Kubernetes Proxy API 是一种特殊的 API,Kube-APIServer 只是代理这类 API 的 HTTP 请求,然后将请求转发到某个节点上的 Kubelet 进程监听的端口上。最后实际是由该端口上的 REST API 响应请求。

    • kubectl proxy

      kubectl proxy --port=8080 &
      
      • 现在,你可以使用 Kubernetes Proxy API 进行访问。比如:需要访问一个服务,可以使用 /api/v1/namespaces/<NAMESPACE>/services/<SERVICE-NAME>/proxy/
  2. 学习 kubectl port-forward 命令及其含义。回答如何通过 port-forward 访问应用?

    从 Kubernetes v1.10 开始,kubectl port-forward 允许使用资源名称(例如 pod 名称)来选择匹配的 pod 来进行端口转发。

    kubectl port-forward 命令转发了本地端口到 pod 端口的连接。它的手册现在这里可以查看。相比于 kubectl proxy,kubectl port-forward 也可以转发 TCP 流量而 kubectl proxy 只能转发 HTTP 流量。

    • kubectl port-forward redis-master-765d459796-258hz 7000:6379

      这相当于

      kubectl port-forward pods/redis-master-765d459796-258hz 7000:6379
      

      或者

      kubectl port-forward deployment/redis-master 7000:6379 
      

      或者

      kubectl port-forward rs/redis-master 7000:6379
      

      或者

      kubectl port-forward svc/redis-master 7000:6379
      

      以上所有命令都应该有效。输出应该类似于:

      I0710 14:43:38.274550    3655 portforward.go:225] Forwarding from      127.0.0.1:7000 -> 6379
      I0710 14:43:38.274797    3655 portforward.go:225] Forwarding from      [::1]:7000 -> 6379
      
  3. 修改 Pod label 使其与 Deployment 不相符,集群有什么变化?

    • deployment 会发现少了自己的 pod,重新启动一个拥有自己 label 的 pod;当然,修改的那个 pod 还存在
  4. 进一步学习 kubectl run。回答如何向 Pod 注入环境变量?如何查看是否注入成功?

    • kubectl run

      • 通过 kubectl run --env 设置环境变量
      kubectl run nginx-test --image=nginx:1.15.2  --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=onemore" --env="ONE=more" -n onemore
      
      • 可以查看到该 pod template 中的 Environment 有刚才定义的环境变量信息
      kubectl describe -n onemore deployments.apps nginx-test
      
  5. 进一步学习 kubectl rollout。回答如何通过 kubectl rollout 将应用回滚到指定版本?

    • 使用 kubectl rollout history deployment/nginx-deployment 查看 deployment 升级历史
      $ kubectl rollout history deployment/nginx-deployment
      deployments "nginx-deployment"
      REVISION  CHANGE-CAUSE
      1         kubectl apply --filename=nginx-test.yml --record=true
      2         kubectl replace --filename=nginx-test.yml --record=true
      
      • 回滚到上一个版本

        kubectl rollout undo deployment/nginx-deployment
        
      • 回滚到指定版本

        kubectl rollout undo deployment/nginx-deployment --to-revision=2
        
      • Note: 如果 CHANGE-CAUSE 为空,那是因为在创建 deployment 时没有使用 --record 选项

  6. Pod LivenessProbe 实验中,检查方式采用的是 http 模式。回答如何使用 exec 进行健康检查?请写出 yaml 文件。

    • 参考资料
    • exec_livenessProbe.yaml
      apiVersion: v1
      kind: Pod
      metadata:
        labels:
          test: liveness
        name: liveness-exec
      spec:
        containers:
        - name: liveness
          image: k8s.gcr.io/busybox  
          args:
          - /bin/sh
          - -c
          - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
          livenessProbe:
            exec:
              command:
              - cat
              - /tmp/healthy
            initialDelaySeconds: 5
            periodSeconds: 5
      
  7. 进一步学习 Pod Lifecycle。回答如何使用 PostStart Hook?请写出 yaml 文件。

    • 参考资料
      apiVersion: v1
      kind: Pod
      metadata:
        name: test-post-start
      spec:
        containers:
        - name: test-post-start-container
          image: busybox
          command: ["/bin/sh", "-c", "sleep 5 && echo $(date) 'written by         entrypoint' >> log.log && sleep 600"]
          lifecycle:
            postStart:
              exec:
                command: ["/bin/sh", "-c", "sleep 30 && echo $(date) 'written by      post start' >> log.log"]
            preStop:
              exec:
                command: ["/bin/sh", "-c", "sleep 15 && echo $(date) 'written by      post stop' >> log.log"]
      
  8. 登录宿主机,使用 docker ps 查看 Pod,如何理解 docker ps 输出?

    • docker ps 会列出所有运行中的容器
    • docker ps –a 会列出所有的容器,不管是运行的,还是停止的

    10张图带你深入理解Docker容器和镜像

    • docker images 会列出了所有顶层(top-level)镜像
      • 实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们提出了 top-level 镜像。只有创建容器时使用的镜像或者是直接 pull 下来的镜像能被称为顶层(top-level)镜像,并且每一个顶层镜像下面都隐藏了多个镜像层
    • docker images –a 列出了所有的镜像,也可以说是列出了所有的可读层
      • 要查看某一个 image-id 下的所有层,可以使用 docker history 来查看
    • docker stop 会向运行中的容器发送一个 SIGTERM 的信号,然后停止所有的进程
    • docker kill 向所有运行在容器中的进程发送了一个不友好的 SIGKILL 信号
    • docker pause 它利用了cgroups的特性将运行中的进程空间暂停
      • 具体的内部原理你可以在这里找到:https://www.kernel.org/doc/Doc ... m.txt,但是这种方式的不足之处在于发送一个SIGTSTP信号对于进程来说不够简单易懂,以至于不能够让所有进程暂停。
    • docker rm 会移除构成容器的可读写层
      • [注意,这个命令只能对非运行态容器执行]
    • docker rmi 会移除构成镜像的一个只读层
      • 你只能够使用 docker rmi 来移除最顶层(top level layer)(也可以说是镜像),你也可以使用 -f 参数来强制删除中间的只读层
    • docker commit 将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像
    • docker build 非常有趣,它会反复的执行多个命令
    • docker exec 会在运行中的容器执行一个新进程
    • docker inspect 会提取出容器或者镜像最顶层的元数据
    • docker save 会创建一个镜像的压缩文件,这个文件能够在另外一个主机的 Docker 上使用
      • 和 export 命令不同,这个命令为每一个层都保存了它们的元数据。这个命令只能对镜像生效
    • docker export 创建一个 tar 文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容
    • docker history 递归地输出指定镜像的历史镜像
  9. 学习使用 Secret,然后创建一个 Secret 并在 Pod 内访问。请写出 secret 和 pod 的 yaml 文件。

    • 创建 secret
      • game.properties

        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
        
        kubectl create secret generic game-secret --from-file=game.properties
        
      • pod_secret.yaml

        apiVersion: v1
        kind: Pod
        metadata:
          name: pod-secret
        spec:
          restartPolicy: Never
          containers:
            - name: test-container
              image: busybox:1.26
              command: ["/bin/sh"]
              args: ["-c", "cat /etc/config/game.properties && sleep 60"]
              volumeMounts:
              - name: config-volume
                mountPath: /etc/config
              resources:
                requests:
                  cpu: "0.1"
                  memory: "100Mi"
                limits:
                  cpu: "0.1"
                  memory: "100Mi"
          volumes:
            - name: config-volume
              secret:
                secretName: game-secret
        
  10. ConfigMap 实验中,我们采用文件加载的方式使用 ConfigMap。请写出利用环境变量加载 configmap 的例子。

    • 创建 configmap

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: demo-configmap-1
        namespace: xxx
      data:
        DEPLOYMENT_ENV: test
      
    • 利用环境变量加载 configmap

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: xxx
        namespace: xxx
        labels:
          app: xxx
      spec:
        strategy:
          type: Recreate
        selector:
          matchLabels:
            app: xxx
        template:
          metadata:
            labels:
              app: xxx
          spec:
            containers:
            - name: demo
              image: xxx/demo:0.0.1
              imagePullPolicy: IfNotPresent
              args: ["--spring.profiles.active=$(DEPLOYMENT_ENV_KEY)"]
              ports:
              - containerPort: 8080
              env:
              - name: DEPLOYMENT_ENV_KEY
                valueFrom:
                  configMapKeyRef:
                    name: demo-configmap-1
                    key: DEPLOYMENT_ENV
      
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant