Docker & Kubernetes 小抄

一、镜像加速器

国内从 Docker Hub 上拉取镜像经常会出现不稳定或连接、下载失败的问题,需要配置国内的镜像加速源:

  1. 对于类 Linux 的系统,可以修改 /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com"
  ]
}
  1. 对于 Windows 或 MacOS 使用 Docker Desktop 的环境,打开 Preferences -> Docker Engine,修改配置文件:
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com"
  ]
}

检查镜像加速源是否生效:

docker info

如果看到以下输出信息,则设置成功:

Registry Mirrors:
  https://dockerhub.azk8s.cn/
  https://hub-mirror.c.163.com/

阅读 Kubernetes 官方文档时,会碰到 gcr.io 或者 k8s.gcr.io 的镜像,这个在国内是无法直接获取的。我们需要将 gcr.io//: 替换为 gcr.azk8s.cn//:,例如

# docker pull gcr.io/google_containers/gb-frontend:v4
docker pull gcr.azk8s.cn/google-samples/gb-frontend:v4

但是,需要相应地修改 YAML 部署文件:

      containers:
      - name: php-redis
        image: gcr.io/google_containers/gb-frontend:v4
      containers:
      - name: php-redis
        image: gcr.azk8s.cn/google-samples/gb-frontend:v4

:可以在执行 kubectl 命令前,查看 YAML 文件中的 image 字段,提前执行 docker pull 将涉及的镜像下载到本地。

二、调试服务

在容器内部调试

这种方式用于测试 Kubernetes DNS(域名解析),在 Kubernetes 内部,服务访问的地址有两种模式::..svc.cluster.local:。举例来说,有如下资源(demo.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: demo
    spec:
      containers:
      - image: springguides/demo
        name: demo
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  ports:
  - name: 8080-8080
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: demo
  type: ClusterIP
status:
  loadBalancer: {}

kubectl exec 可以在 Pod 里执行命令,但是默认没有 curl,使用以下文件创建资源:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: curl-deployment
spec:
  selector:
    matchLabels:
      app: curlpod
  replicas: 1
  template:
    metadata:
      labels:
        app: curlpod
    spec:
      containers:
      - name: curlpod
        command:
        - sh
        - -c
        - while true; do sleep 1; done
        image: radial/busyboxplus:curl

因此我们可以用以下两种方式测试服务:

kubectl exec curl-deployment-847ffc65d9-vdc6g -- curl http://demo:8080/actuator
kubectl exec curl-deployment-847ffc65d9-vdc6g -- curl http://demo.default.svc.cluster.local:8080/actuator

也可以使用交互模式执行 curl

kubectl exec -ti curl-deployment-847ffc65d9-vdc6g sh
# kubectl exec -ti curl-deployment-847ffc65d9-vdc6g bash
  • -t 的意思是获取一个伪终端 tty;
  • -i 的意思是绑定容器的输出。

在容器外调试

使用 Port Forwarding,依然以上面的服务为例:

kubectl port-forward demo-5cbfcb49b5-mqscg 8081:8080

:将宿主机(即本机 localhost)的 8081 端口映射到 Pod 的 8080(即服务端口),然后在本机执行:

curl localhost:8081/actuator

DNS 调试

dnsutils.yaml :

apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: default
spec:
  containers:
  - name: dnsutils
    image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
kubectl apply -f dnsutils.yaml
kubectl exec -ti dnsutils sh

nslookup 

三、kubectl Cheat Sheet

快速创建 YAML 模板

kubectl create deployment demo --image=springguides/demo --dry-run -o=yaml > deployment.yaml
echo --- >> deployment.yaml
kubectl create service clusterip demo --tcp=8080:8080 --dry-run -o=yaml >> deployment.yaml

四、Docker 私有仓库

启动 Docker Registry :

docker run -d -p 5000:5000 --restart=always --name registry registry:2

关停并删除数据:

docker container stop registry 
docker container rm -v registry

修改 Docker 镜像源(/etc/docker/daemon.json):

{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com"
  ],
  "insecure-registries": ["localhost:5000"]
}

将本地镜像打 tag ,推送到本地仓库:

docker tag / localhost:5000//
docker push localhost:5000//

修改 Kubernetes 的 image 字段:

spec:
    spec:
      containers:
      - image: localhost:5000//

:实际生产环境部署需要 TLS 等加密配置。

五、更改已有容器的配置

更改端口映射(Port Mapping)

在修改配置文件之前,首先需要停止 Docker 服务,sudo systemctl stop docker ,否则配置修改不生效。

/var/lib/docker/containers//hostconfig.json

    "PortBindings": {
        "22/tcp": [
            {
                "HostIp": "",
                "HostPort": "2222"
            }
        ],
        "443/tcp": [
            {
                "HostIp": "",
                "HostPort": "443"
            }
        ],
        "80/tcp": [
            {
                "HostIp": "",
                "HostPort": "80"
            }
        ]
    },

HostPort 修改为相应的新端口,比如说:

    "PortBindings": {
        "22/tcp": [
            {
                "HostIp": "",
                "HostPort": "2222"
            }
        ],
        "443/tcp": [
            {
                "HostIp": "",
                "HostPort": "6666"
            }
        ],
        "80/tcp": [
            {
                "HostIp": "",
                "HostPort": "6667"
            }
        ]
    },

六、Docker Desktop

Kubernetes 一直处于 Starting 状态(https://github.com/docker/for-mac/issues/3594
):

rm -rf ~/Library/Group\ Containers/group.com.docker/pki/

升级 Docker Desktop for Mac 之后,由于网络的问题,会出现 Starting 状态(https://cloud.tencent.com/developer/article/1596046),最好手动 pull 镜像:

docker pull k8s.gcr.io/kube-proxy:v1.18.8
docker pull k8s.gcr.io/kube-controller-manager:v1.18.8
docker pull k8s.gcr.io/kube-scheduler:v1.18.8
docker pull k8s.gcr.io/kube-apiserver:v1.18.8
docker pull k8s.gcr.io/coredns:1.6.7
docker pull k8s.gcr.io/pause:3.2
docker pull k8s.gcr.io/etcd:3.4.3-0

Metrics Server

args:
  - --cert-dir=/tmp
  - --secure-port=4443
  - --kubelet-insecure-tls

加上 --kubelet-insecure-tls 到部署文件中,注意不要在开放集群中使用该参数。

七、清理本地 Docker 镜像

#!/usr/bin/env bash
image_name=($(docker images | grep localhost | awk '{ print $1 }'))
image_version=($(docker images | grep localhost | awk '{ print $2 }'))

for ((i=0; i<${#image_name[@]}; ++i)); do
   if [ ${image_version[i]} != "latest" ]; then
      if [ ${image_name[i]} != "localhost:5000/hello-world-alpine" ]; then
         eval docker image rm "${image_name[i]}":"${image_version[i]}"
      fi
   fi
done

你可能感兴趣的:(Docker & Kubernetes 小抄)