主要记录最近遇到的一些开发问题,解决方法。
1. Kubernetes 服务仅在负载节点可用
正常情况下 NodePort 类型的 Service ,任意 Node 节点 IP + 端口,都可以访问。但是,也有可能仅负载的 Node 节点 IP + 端口可以访问。首先,可以尝试配置转发相关参数:
1
2
3
4
5
6
|
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
|
另外一种可能是防火墙,没有豁免 IPENCAP 协议:Calico 网络插件,有两种模式 BGP 、IPIP。使用 IPIP 模式时,需要在防火墙中,开启 IPENCAP 协议。
2. /var/lib/docker 目录迁移或扩容
1
|
mv /var/lib/docker /var/lib/docker_bk
|
1
2
3
4
|
mkdir -p /data/docker/
rsync -avz /var/lib/docker_bk/ /data/docker/
du -h --max-depth=0 /data/docker
ln -s /data/docker /var/lib/docker
|
3. kubectl 获取全部使用的镜像
1
|
kubectl get pod --all-namespaces -o=jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{range .spec.initContainers[*]}{.image}{"\n"}{end}{end}' | sort -u
|
4. 使用 Telepresence 远程调用 Kubernetes
Telepresence 是 CNCF 基金会下的一个项目。它的工作原理是在本地和 Kubernetes 集群之间,搭建一个透明的双向代理。使用 Telepresence 可以实现的功能:
- 本地的服务就可以完整的访问到远程集群中的其他服务。
- 本地的服务直接访问到 Kubernetes 里的各种资源,包括环境变量、Secrets、ConfigMap 等。
- 集群直接访问到本地暴露出来的接口。
kubectl 安装配置。
在本地,安装并配置 kubectl ,使其可以正常访问 Kubernetes 集群。
安装 Telepresence
1
2
|
brew cask install osxfuse
brew install datawire/blackbird/telepresence
|
本地连通远程分支
本地访问远程集群服务
找到服务域名:
1
2
3
|
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 2h
myservice ClusterIP 10.233.4.163 <none> 8000/TCP 2m
|
打开本地任意 Console ,即可直接访问集群内部服务:
1
|
curl http://myservice:8000
|
远程集群访问本地服务
远程集群通过端口 8000 ,访问本地 8080 端口服务,有两种方式:
1
|
telepresence --new-deployment new_deploy_name --expose 8080:8000
|
1
|
telepresence --swap-deployment existed_deploy_name --expose 8080:8000
|