kubernetes - 在同一个pod上使用其他容器的端口来设置环境变量

时间:2018-02-25 21:08:49

标签: docker kubernetes environment-variables yaml

我想以编程方式与位于同一pod中的容器进行通信。

所以,我决定将辅助容器的端口(本例中为 bar1-container bar2-container )设置为环境变量主容器的>(即 foo-container )。

但是,在我的部署配置的.yaml文件中,我无法弄清楚如何通过辅助端口的公开端口隐式

apiVersion:  apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: test-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: web
        tier: frontend
    spec:
      containers:
      # Only container to be exposed outside the pod
      - name: foo-container
        image: foo
        env:
        - name: BAR_1_PORT
          # HOW TO GET PORT HERE IMPLICITLY ???
          value: XXXX 
        - name: BAR_2_PORT
          # HOW TO GET PORT HERE IMPLICITLY ???
          value: XXXX
        ports:
        - name: https
          containerPort: 443
        - name: http
          containerPort: 80
      # SubContainer 1
      - name: bar1-container
        image: bar1
      # SubContainer 2
      - name: bar2-container
        image: bar2

我想知道是否有办法使用像${some-variable-or-so-here}这样的端口,而不是5300809000或从容器中暴露的任何端口。

P.S:我故意没有在上面的yaml配置中指定辅助容器的portscontainerPort值,因为它们不会暴露在容器之外。

1 个答案:

答案 0 :(得分:1)

您正在这里混合容器,吊舱和服务。如果在同一个pod中有多个容器,要在它们之间进行通信,则根本不需要服务,还需要将它指向主机名,因为它们共享相同的网络命名空间。您需要做的就是连接到您的特定服务正在侦听的端口上的#include <iostream> #include <variant> #include <vector> #include <string> enum foo_kind_t { double_list, name_tag, number, unknown }; template <typename val_t> struct get_foo_kind_t { constexpr static foo_kind_t value = unknown; }; template <> struct get_foo_kind_t<int> { constexpr static foo_kind_t value = number; }; template <> struct get_foo_kind_t<std::string> { constexpr static foo_kind_t value = name_tag; }; template <> struct get_foo_kind_t<std::vector<double>> { constexpr static foo_kind_t value = double_list; }; class foo_t { public: foo_t(): kind(unknown) {} template <typename val_t> void assign_bar(const val_t &val) { static_assert(get_foo_kind_t<val_t>::value != unknown, "unsupported assignment"); kind = get_foo_kind_t<val_t>::value; bar = val; } foo_kind_t get_kind() { return kind; } template <typename val_t> val_t get_bar() { if (get_foo_kind_t<val_t>::value != kind) { throw std::runtime_error("wrong kind"); } return std::get<val_t>(bar); } private: foo_kind_t kind; std::variant< int, std::string, std::vector<double> > bar; }; template <typename val_t> void print_foo(foo_t &foo) { std::cout << "kind: " << foo.get_kind() << std::endl; std::cout << "value: " << foo.get_bar<val_t>() << std::endl << std::endl; } int main(int, char*[]) { // double_list foo_t b; std::vector<double> b_val({ 1.0, 1.1, 1.2 }); b.assign_bar(b_val); std::cout << "kind: " << b.get_kind() << std::endl; std::cout << "value: vector size: " << b.get_bar<std::vector<double>>().size() << std::endl << std::endl; // name_tag foo_t d; std::string d_val("name"); d.assign_bar(d_val); print_foo<std::string>(d); // number foo_t c; int c_val = 99; c.assign_bar(c_val); print_foo<int>(c); // unknown foo_t a; std::cout << a.get_kind() << std::endl; return 0; } 。例如,你可以让nginx容器(监听80)通过localhost连接到php-fpm的第二个容器服务。