跳到主要内容

49.privileged

PR # 1288

Add support for privileged containers.

Why

yugui:Sometimes containers need to run with privileged mode.Container manifest schema should support privileged flag so that users can deploy privileged container.

thockin:这是一个危险的开端。你能详细说明为什么人们应该能够用这个?我宁愿继续教Docker如何启用各种以更精细的方式提供特权。

ironcladlou:事实仍然是,Docker将特权容器公开为其核心API的一部分。我不认为 Kubernetes 有责任在这方面保护 API 消费者免受较低级别功能的影响。作为一个基础设施,Kube 如何决定在给定的使用环境中什么是安全的,什么是不安全的?例如,Kube 是否应该限制容器中的主机卷挂载?它如何知道给定整体部署上下文(例如本地部署、多租户托管解决方案)的安全?

How

支持并不复杂,kubelet 加一个启动参数,是否允许启动特权容器,如果配置了允许启动,并且用户的 container spec 中配置了此容器是特权容器,则调用 startContainer 时候传给docker 特权标识

PR # 1239

Proposal for solving api plugability

Why

  • In the conversion package, expose Src/Dest struct tags to conversionFuncs via the Scope, and the source/dest versions.
  • In runtime, add "RawExtension" which just stores raw JSON (or yaml?) for deferred unpacking.
  • In runtime, add global named Schemes.
  • In runtime, add to the DefaultScheme conversionFuncs which convert between RawExtension and EmbeddedObject. They use a struct tag on the internal structure to determine which scheme to use, defaulting to DefaultScheme.

I think this is easy, readable, extensible, and will emit the JSON that we want.

How

1.convert 加上函数 NameFunc 来再转换的时候判断类型是否相同

2.引入新的结构体 scope 再递归转换时候传递这个结构体,同时将 flags, converter ,meta ,tag 放入

  • convert 上层传递下来的转换器
  • flags 记录复制规则
  • meta 传递全局信息
  • tag 让用户在转换时候能获取 tag

3.引入 rawExtension 和 unknow

这段代码定义了一些结构体,用于处理 Kubernetes 中的插件对象和未知类型对象的编码和解码。

PluginBase: 这个结构体用于表示插件对象的基本信息。它只包含一个Kind字段,用于表示对象的种类。它不会单独进行编码,而是作为其他对象的一部分进行编码。

EmbeddedObject: 这个结构体是为了允许在其他 API 对象中嵌入只在运行时知道类型的 API 对象。在内存中,嵌入的对象可以通过Get函数作为Object进行访问,但在网络上传输时,它会被存储为[]byte。这允许灵活地在API对象中嵌入各种类型的插件。

RawExtension: 与 EmbeddedObject 配合使用,以允许两阶段编码扩展对象。它存储原始 JSON 字节,以便稍后可以转换为特定类型。在解码时,它首先使用 JSON 或 YAML 将序列化的数据解组到外部结构中,这会导致原始 JSON 被存储但不会被解包。然后,它使用转换来将数据复制到内部结构。Kubernetes 的转换功能会解包 RawExtension 中存储的 JSON,将其转换为正确的对象类型,并将其存储在 EmbeddedObject 中。

Unknown: 这个结构体用于处理未知类型的 API 对象。它允许通过系统传递具有未知类型的 API 对象。它仍然有一个 functioning JSONBase 特性(kind,version,resourceVersion等),但是,RawJSON 字段将保存无法与已注册类型匹配的对象的完整 JSON。目前,该结构体的实现尚未完成(如代码注释中的“TODO”所示)。

这些结构体在 Kubernetes 中非常重要,因为 Kubernetes 允许使用 CRD (Custom Resource Definitions) 和其他机制来扩展其 API。EmbeddedObject 和 RawExtension 允许在不知道确切类型的情况下嵌入和处理这些扩展。

4.我们来看一些测试代码方便你理解

func TestConverter_tags(t *testing.T) {
type Foo struct {
A string `test:"foo"`
}
type Bar struct {
A string `test:"bar"`
}
c := NewConverter()
c.Debug = t
err := c.Register(
func(in *string, out *string, s Scope) error {
if e, a := "foo", s.SrcTag().Get("test"); e != a {
t.Errorf("expected %v, got %v", e, a)
}
if e, a := "bar", s.DestTag().Get("test"); e != a {
t.Errorf("expected %v, got %v", e, a)
}
return nil
},
)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
c.Convert(&Foo{}, &Bar{}, 0, nil)
}

func TestConverter_meta(t *testing.T) {
type Foo struct{ A string }
type Bar struct{ A string }
c := NewConverter()
c.Debug = t
checks := 0
err := c.Register(
func(in *Foo, out *Bar, s Scope) error {
if s.Meta() == nil || s.Meta().SrcVersion != "test" || s.Meta().DestVersion != "passes" {
t.Errorf("Meta did not get passed!")
}
checks++
s.Convert(&in.A, &out.A, 0)
return nil
},
)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
err = c.Register(
func(in *string, out *string, s Scope) error {
if s.Meta() == nil || s.Meta().SrcVersion != "test" || s.Meta().DestVersion != "passes" {
t.Errorf("Meta did not get passed a second time!")
}
checks++
return nil
},
)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
err = c.Convert(&Foo{}, &Bar{}, 0, &Meta{SrcVersion: "test", DestVersion: "passes"})
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if checks != 2 {
t.Errorf("Registered functions did not get called.")
}
}