目录

    主要记录最近遇到的一些开发问题,解决方法。

    1. Kubernetes 服务仅在负载节点可用

    正常情况下 NodePort 类型的 Service ,任意 Node 节点 IP + 端口,都可以访问。但是,也有可能仅负载的 Node 节点 IP + 端口可以访问。

    首先,可以尝试配置转发相关参数:

    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
    
    sysctl --system
    

    另外一种可能是防火墙,没有豁免 IPENCAP 协议:

    Calico 网络插件,有两种模式 BGP 、IPIP。使用 IPIP 模式时,需要在防火墙中,开启 IPENCAP 协议。

    2. /var/lib/docker 目录迁移或扩容

    • 停止相关服务,保证数据一致性
    service docker stop
    
    • 备份数据
    mv /var/lib/docker /var/lib/docker_bk
    
    • 迁移数据
    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
    
    • 重启相关服务
    service docker start
    

    3. kubectl 获取全部使用的镜像

    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 等。
    • 集群直接访问到本地暴露出来的接口。
    1. kubectl 安装配置。

    在本地,安装并配置 kubectl ,使其可以正常访问 Kubernetes 集群。

    1. 安装 Telepresence
    brew cask install osxfuse
    brew install datawire/blackbird/telepresence
    
    1. 本地连通远程分支
    telepresence
    
    1. 本地访问远程集群服务

    找到服务域名:

    kubectl get svc
    
    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 ,即可直接访问集群内部服务:

    curl http://myservice:8000
    
    Hello, world!
    
    1. 远程集群访问本地服务

    远程集群通过端口 8000 ,访问本地 8080 端口服务,有两种方式:

    • 新建 Deployment
    telepresence --new-deployment new_deploy_name --expose 8080:8000
    
    • 替换已经存在的 Deployment
    telepresence --swap-deployment existed_deploy_name --expose 8080:8000