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/<repo-name>/<image-name>:<version> 替换为 gcr.azk8s.cn/<repo-name>/<image-name>:<version>,例如

# 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 内部,服务访问的地址有两种模式:<service_name>:<port><service_name>.<namespace>.svc.cluster.local:<port>。举例来说,有如下资源(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 <service-name>

三、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 <repository_name>/<image_name> localhost:5000/<repository_name>/<image_name>
docker push localhost:5000/<repository_name>/<image_name>

修改 Kubernetes 的 image 字段:

spec:
    spec:
      containers:
      - image: localhost:5000/<repository_name>/<image_name>

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

五、更改已有容器的配置

更改端口映射(Port Mapping)

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

/var/lib/docker/containers/<container_hash>/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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • Docker Hub 镜像加速器列表 检查加速器是否生效 命令行执行 docker info,如果从结果中看到了如...
    陈sir的知识图谱阅读 2,382评论 1 0
  • 1、环境介绍 master:192.168.21.10 node01:192.168.21.11 node02:1...
    A浓眉小眼A阅读 441评论 0 0
  • 版权声明:原创作品,谢绝转载!否则将追究法律责任。 前言 最近中国和印度的局势也是愈演愈烈。作为一个爱国青年我有些...
    李伟铭MIng阅读 2,066评论 0 5
  • Docker概览 Docker是一个用于开发、交付和运行应用的开放平台,Docker被设计用于更快地交付应用。Do...
    i_cyy阅读 1,293评论 0 7
  • #幸福是需要修出来的~每天进步1%~幸福实修13班~19 chfenj# 20180110(43/60) 【幸福三...
    chfenj阅读 197评论 2 2