美文网首页
Pod内进程访问k8s服务

Pod内进程访问k8s服务

作者: 陈先生_9e91 | 来源:发表于2018-09-15 10:36 被阅读0次

Pod内进程访问k8s服务

外部服务可以通过kubeconfig访问k8s服务,那k8s集群内部服务(Pos内服务)如何访问k8s?

kubeconfig

用configMap保存kueconfig以及ca,供服务访问。这个比较简单,不扩展。

serviceaccount

sa是给运行在Pod中的进程用的,它为Pod里的进程提供必要的身份证明。

sa中有token、ca.crt以及namespace信息。serviceaccount controller保证了每个namespace下都有一个名为default的sa。

通过sa我们就可以访问k8s服务,以下是k8s.io\client-go\rest\config.go中的方法,描述了如何利用sa进行访问。

// InClusterConfig returns a config object which uses the service account
// kubernetes gives to pods. It's intended for clients that expect to be
// running inside a pod running on kubernetes. It will return an error if
// called from a process not running in a kubernetes environment.
func InClusterConfig() (*Config, error) {
    host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT")
    if len(host) == 0 || len(port) == 0 {
        return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined")
    }

    token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountTokenKey)
    if err != nil {
        return nil, err
    }
    tlsClientConfig := TLSClientConfig{}
    rootCAFile := "/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountRootCAKey
    if _, err := certutil.NewPool(rootCAFile); err != nil {
        glog.Errorf("Expected to load root CA config from %s, but got err: %v", rootCAFile, err)
    } else {
        tlsClientConfig.CAFile = rootCAFile
    }

    return &Config{
        // TODO: switch to using cluster DNS.
        Host:            "https://" + net.JoinHostPort(host, port),
        BearerToken:     string(token),
        TLSClientConfig: tlsClientConfig,
    }, nil
}

本质上,sa就是一个目录/var/run/secrets/kubernetes.io/serviceaccount,k8s创建容器的时候都会将default sa挂载到Pod里。

关于k8s服务地址,默认k8s都会起一个名为kubernetes的服务,供集群内服务调用,并且早期的服务发现都是通过环境变量的方式注入到容器里面的,这些在上面的代码都有体现。

相关文章

  • Pod内进程访问k8s服务

    Pod内进程访问k8s服务 外部服务可以通过kubeconfig访问k8s服务,那k8s集群内部服务(Pos内服务...

  • k8s-访问外网服务的两种方式

    需求 k8s集群内的pod需要访问mysql,由于mysql的性质,不适合部署在k8s集群内,故k8s集群内的应用...

  • k8s之service account

    service account是k8s为pod内部的进程访问apiserver创建的一种用户。其实在pod外部也可...

  • k8s中service和endpoint

    K8s提供了service对象来访问pod。 为什么没有直接访问pod?一是k8s中pod不是持久性的,宕机重建将...

  • K8S 网络详解 2 kubernetes 网络实现

    K8S 的网络特征: 每个POD 一个IP (IP peer POD) 所有POD 通过IP 直接访问其他POD...

  • k8s集群calico网络故障记录

    报错 访问k8s的dashboard界面无法访问网站,查看pod未知原因导致calico的Pod资源重新创建后无法...

  • service

    解决虚拟私有ip地址无法访问的问题。通过固定的虚拟ip和负载均衡对pod内的服务进行访问.

  • k8s Ingress 服务部署方式

    k8s Ingress 服务部署方式 通常情况下,service和pod仅可在集群内部网络中通过IP地址访问。所有...

  • k8s 问题解决

    core-dns 的 启动失败 重启k8s后 etcd 启动失败 k8s集群关机后重启pod访问不到外网 k8s证...

  • k8s系统预留资源

    k8s的节点调度按照Capacity调度,默认情况下pod 使用节点的全部可用容量。 计算节点的进程分为: Pod...

网友评论

      本文标题:Pod内进程访问k8s服务

      本文链接:https://www.haomeiwen.com/subject/xuuzgftx.html