一、镜像加速器
国内从 Docker Hub 上拉取镜像经常会出现不稳定或连接、下载失败的问题,需要配置国内的镜像加速源:
- 对于类 Linux 的系统,可以修改
/etc/docker/daemon.json
:
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
]
}
- 对于 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 内部,服务访问的地址有两种模式:
和
。举例来说,有如下资源(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/
:
"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