加快Kubernetes編譯速度
除了linux/amd64,默認還會爲其他平臺做交叉編譯。爲了減少編譯時間,可以修改hack/lib/golang.sh,把KUBE_SERVER_PLATFORMS, KUBE_CLIENT_PLATFORMS和KUBE_TEST_PLATFORMS中除linux/amd64以外的其他平臺註釋掉
gcr.io無法訪問
Kubernetes在創建Pod的時候,需要從gcr.io下載一個helper鏡像(目前是 gcr.io/google_containers/pause-amd64:3.0 )。
但是目前國內無法訪問gcr.io,這個問題會導致無法下載該鏡像,然後Pod一直處於ContainerCreating狀態。
解決辦法
1) 在可以訪問gcr.io的地方
docker pull gcr.io/google_containers/pause-amd64:3.0
傳到私有docker registry
docker tag gcr.io/google_containers/pause-amd64:3.0 k8s-docker.mydomain.com/google_containers/pause-amd64:3.0
docker push k8s-docker.mydomain.com/google_containers/pause-amd64:3.0
2) 在所有的k8s節點
docker pull k8s-docker.mydomain.com/google_containers/pause-amd64:3.0
docker tag k8s-docker.mydomain.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
Note
不通過私有registry中轉,而是使用docker save/load應該也可以(未測試),只是比較麻煩。
從集羣外訪問Service和Pod
這裏說的集羣外是指K8s集羣以外的主機,比如使用nginx/HAProxy搭建的負載均衡主機。這些主機跟K8s集羣部署在一起,到K8s網絡可達。
對於不是部署在GCE以及AWS等雲平臺的K8s,我們一般需要自己搭建負載均衡,然後分發請求到到Service。
使用NodePort方式發佈服務,那麼負載均衡主機上不需要額外配置;使用ClusterIP方式,爲了能夠訪問Service的ClusterIP, 需要在這些主機上安裝Flanneld和kube-proxy
坑1:
IPV4 forwording報錯,但是容器運行正常。
[root@registry mnt]# docker run -d -p 5000:5000 -v /mnt/date/registry registry
WARNING: IPv4 forwarding is disabled. Networking will not work.
970e18480c47661fd2cffab9f7e0410989e62ed9d229333cb32e5727a2e88b3b
解決方案:
在/etc/sysctl.conf文件中加入net.ipv4.ip_forward=1並重啓網絡服務。
修改後正常:
[root@registry mnt]# docker run -d -p 5000:5000 -v /mnt/date/registry registry
abbec57e5dca734689cfd953f27564156ec24e32ae6e532043309f0332653650
[root@registry mnt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abbec57e5dca registry "/entrypoint.sh /etc/" 31 seconds ago Up 30 seconds 0.0.0.0:5000->5000/tcp compassionate_mclean
坑2:
查看鏡像存放位置顯示404 page not found網上很多教程都是下面這個命令
[root@docker01 ~]# curl http://10.100.50.122:5000/v2/search
404 page not found
通過docker search registry發現安裝的是2.0版本
[root@etcd registry]# docker search docker-registry
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/alpine A minimal Docker image based on Alpine Lin... 3733 [OK]
docker.io docker.io/registry The Docker Registry 2.0 implementation for... 2031 [OK]
V2的命令格式如下:
[root@docker01 ~]# curl http://10.100.50.122:5000/v2/_catalog
{"repositories":["busybox","centos"]}
坑3:
[root@k8s-master demo]# docker pull 10.0.0.10:5000/busybox
Using default tag: latest
Trying to pull repository 10.0.0.10:5000/busybox ...
Get https://10.0.0.10:5000/v1/_ping: http: server gave HTTP response to HTTPS client
[root@k8s-master demo]# vi /etc/sysconfig/docker
需要檢查客戶端
OPTIONS='--selinux-enabled --insecure-registry 10.0.0.10:5000'
坑4:
[root@k8s-master demo]# cat /etc/kubernetes/kubelet
###
# kubernetes kubelet (minion) config
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=127.0.0.1"
# The port for the info server to serve on
# KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
# pod infrastructure container
#KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=kube-registry:5000"
# Add your own!
KUBELET_ARGS=""
KUBELET_POD_INFRA_CONTAINER
Pod 啓動時的一個基礎容器,你可以通過Dokcer ps -a命令看到這個容器,類似windows系統服務,供kubenetes內部使用。
這個是一個基礎容器,每一個Pod啓動的時候都會啓動一個這樣的容器。如果你的本地沒有這個鏡像,kubelet會連接外網把這個鏡像下載下來。最開始的時候是在Google的registry上,因此國內因爲GFW都下載不了導致Pod運行不起來。現在每個版本的Kubernetes都把這個鏡像打包,你可以提前傳到自己的registry上,然後再用這個參數指定。
[root@k8s-master demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox 0/1 ContainerCreating 0 36m
這是導致STATUS的狀態始終無法running的根本原因