Merge pull request #12792 from justinsb/gossip_coredns_hosts_via_services

gossip: support resolution of k8s.local names from pods (via services)
This commit is contained in:
Kubernetes Prow Robot 2021-11-20 15:00:59 -08:00 committed by GitHub
commit 034af62889
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
121 changed files with 696 additions and 227 deletions

View File

@ -21,6 +21,7 @@ go_library(
"//vendor/k8s.io/api/coordination/v1:go_default_library", "//vendor/k8s.io/api/coordination/v1:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp:go_default_library", "//vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library",
"//vendor/k8s.io/klog/v2/klogr:go_default_library", "//vendor/k8s.io/klog/v2/klogr:go_default_library",

View File

@ -4,6 +4,7 @@ go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"awsipam.go", "awsipam.go",
"hosts_controller.go",
"legacy_node_controller.go", "legacy_node_controller.go",
"node_controller.go", "node_controller.go",
], ],
@ -27,7 +28,9 @@ go_library(
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/client-go/dynamic:go_default_library",
"//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime:go_default_library", "//vendor/sigs.k8s.io/controller-runtime:go_default_library",

View File

@ -0,0 +1,183 @@
/*
Copyright 2021 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package controllers
import (
"context"
"encoding/json"
"fmt"
"reflect"
"sort"
"strings"
"github.com/go-logr/logr"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/dynamic"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/apis/kops"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/manager"
)
// HostsReconciler populates an /etc/hosts style file in the CoreDNS config map,
// supporting in-pod resolution of our k8s.local entries.
type HostsReconciler struct {
// configMapID identifies the configmap we should update
configMapID types.NamespacedName
// client is the controller-runtime client
client client.Client
// log is a logr
log logr.Logger
// dynamicClient is a client-go client for patching ConfigMaps
dynamicClient dynamic.Interface
// lastUpdate holds the last value we updated, to reduce spurious updates.
lastUpdate *managedConfigMap
}
// NewHostsReconciler is the constructor for a HostsReconciler
func NewHostsReconciler(mgr manager.Manager, configMapID types.NamespacedName) (*HostsReconciler, error) {
r := &HostsReconciler{
client: mgr.GetClient(),
log: ctrl.Log.WithName("controllers").WithName("Hosts"),
configMapID: configMapID,
}
dynamicClient, err := dynamic.NewForConfig(mgr.GetConfig())
if err != nil {
return nil, fmt.Errorf("error building dynamic client: %v", err)
}
r.dynamicClient = dynamicClient
return r, nil
}
// +kubebuilder:rbac:groups=,resources=endpoints,verbs=get;list;watch
// +kubebuilder:rbac:groups=,resources=configmaps,namespace=kube-system,resourceNames=coredns,verbs=get;patch
// Reconcile is the main reconciler function that observes node changes.
func (r *HostsReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
_ = r.log.WithValues("endpoints", req.NamespacedName)
// Although we label the service, the labels get copied to the endpoints by the kube-controller-manager.
endpointsLabels := client.HasLabels([]string{kops.DiscoveryLabelKey})
endpointsList := &corev1.EndpointsList{}
// For security, we only process endpoints in kube-system
if err := r.client.List(ctx, endpointsList, endpointsLabels, client.InNamespace("kube-system")); err != nil {
klog.Warningf("unable to list endpoints: %v", err)
return ctrl.Result{}, err
}
return ctrl.Result{}, r.updateHosts(ctx, endpointsList)
}
func (r *HostsReconciler) updateHosts(ctx context.Context, endpointsList *corev1.EndpointsList) error {
addrToHosts := make(map[string][]string)
for i := range endpointsList.Items {
endpoints := &endpointsList.Items[i]
hostname := endpoints.Labels[kops.DiscoveryLabelKey]
if hostname == "" {
klog.Warningf("endpoints %s/%s found without discovery label %q; filtering is not working correctly", endpoints.Name, endpoints.Namespace, kops.DiscoveryLabelKey)
continue
}
for j := range endpoints.Subsets {
subset := &endpoints.Subsets[j]
for k := range subset.Addresses {
address := &subset.Addresses[k]
ip := address.IP
if ip != "" {
addrToHosts[ip] = append(addrToHosts[ip], hostname)
}
}
}
}
return r.updateConfigMap(ctx, addrToHosts)
}
// managedConfigMap holds the fields we manage
type managedConfigMap struct {
APIVersion string `json:"apiVersion"`
Kind string `json:"kind"`
Data map[string]string `json:"data"`
}
func (r *HostsReconciler) updateConfigMap(ctx context.Context, addrToHosts map[string][]string) error {
var block []string
for addr, hosts := range addrToHosts {
sort.Strings(hosts)
block = append(block, addr+"\t"+strings.Join(hosts, " "))
}
// Sort into a consistent order to minimize updates
sort.Strings(block)
hosts := strings.Join(block, "\n")
data := &managedConfigMap{}
data.APIVersion = "v1"
data.Kind = "ConfigMap"
data.Data = map[string]string{"hosts": hosts}
if r.lastUpdate != nil && reflect.DeepEqual(r.lastUpdate, data) {
klog.Infof("skipping hosts configmap update (unchanged): %#v", data)
return nil
}
klog.Infof("patching hosts configmap: %#v", data)
configmapGVR := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "configmaps"}
patch, err := json.Marshal(data)
if err != nil {
return fmt.Errorf("failed to marshal patch: %w", err)
}
// It is strongly recommended for controllers to always "force" conflicts, since they might not be able to resolve or act on these conflicts.
force := true
patchOpts := metav1.PatchOptions{
FieldManager: "kops-controller.kops.k8s.io/hosts",
Force: &force,
}
if _, err := r.dynamicClient.Resource(configmapGVR).Namespace(r.configMapID.Namespace).Patch(ctx, r.configMapID.Name, types.ApplyPatchType, patch, patchOpts); err != nil {
return fmt.Errorf("failed to patch configmap: %w", err)
}
r.lastUpdate = data
return nil
}
func (r *HostsReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&corev1.Endpoints{}).
Complete(r)
}

View File

@ -24,6 +24,7 @@ import (
coordinationv1 "k8s.io/api/coordination/v1" coordinationv1 "k8s.io/api/coordination/v1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/klog/v2/klogr" "k8s.io/klog/v2/klogr"
@ -155,6 +156,11 @@ func main() {
os.Exit(1) os.Exit(1)
} }
if err := addGossipController(mgr, &opt); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "GossipController")
os.Exit(1)
}
// +kubebuilder:scaffold:builder // +kubebuilder:scaffold:builder
setupLog.Info("starting manager") setupLog.Info("starting manager")
@ -241,3 +247,25 @@ func addNodeController(mgr manager.Manager, opt *config.Options) error {
return nil return nil
} }
func addGossipController(mgr manager.Manager, opt *config.Options) error {
if opt.Discovery == nil || !opt.Discovery.Enabled {
return nil
}
configMapID := types.NamespacedName{
Namespace: "kube-system",
Name: "coredns",
}
controller, err := controllers.NewHostsReconciler(mgr, configMapID)
if err != nil {
return err
}
if err := controller.SetupWithManager(mgr); err != nil {
return err
}
return nil
}

View File

@ -29,6 +29,9 @@ type Options struct {
// EnableCloudIPAM enables the cloud IPAM controller. // EnableCloudIPAM enables the cloud IPAM controller.
EnableCloudIPAM bool `json:"enableCloudIPAM,omitempty"` EnableCloudIPAM bool `json:"enableCloudIPAM,omitempty"`
// Discovery configures options relating to discovery, particularly for gossip mode.
Discovery *DiscoveryOptions `json:"discovery,omitempty"`
} }
func (o *Options) PopulateDefaults() { func (o *Options) PopulateDefaults() {
@ -58,3 +61,9 @@ type ServerProviderOptions struct {
AWS *awsup.AWSVerifierOptions `json:"aws,omitempty"` AWS *awsup.AWSVerifierOptions `json:"aws,omitempty"`
GCE *gcetpm.TPMVerifierOptions `json:"gce,omitempty"` GCE *gcetpm.TPMVerifierOptions `json:"gce,omitempty"`
} }
// DiscoveryOptions configures our support for discovery, particularly gossip DNS (i.e. k8s.local)
type DiscoveryOptions struct {
// Enabled specifies whether support for discovery population is enabled.
Enabled bool `json:"enabled"`
}

2
go.mod
View File

@ -80,6 +80,7 @@ require (
gopkg.in/gcfg.v1 v1.2.3 gopkg.in/gcfg.v1 v1.2.3
gopkg.in/inf.v0 v0.9.1 gopkg.in/inf.v0 v0.9.1
gopkg.in/square/go-jose.v2 v2.5.1 gopkg.in/square/go-jose.v2 v2.5.1
gopkg.in/yaml.v2 v2.4.0
helm.sh/helm/v3 v3.7.1 helm.sh/helm/v3 v3.7.1
k8s.io/api v0.22.2 k8s.io/api v0.22.2
k8s.io/apimachinery v0.22.2 k8s.io/apimachinery v0.22.2
@ -225,7 +226,6 @@ require (
google.golang.org/protobuf v1.27.1 // indirect google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/apiextensions-apiserver v0.22.2 // indirect k8s.io/apiextensions-apiserver v0.22.2 // indirect
k8s.io/cloud-provider v0.22.2 // indirect k8s.io/cloud-provider v0.22.2 // indirect

View File

@ -28,4 +28,8 @@ const (
// UpdatePolicyExternal is a value for ClusterSpec.UpdatePolicy and InstanceGroup.UpdatePolicy indicating that upgrades are done externally, and we should disable automatic upgrades // UpdatePolicyExternal is a value for ClusterSpec.UpdatePolicy and InstanceGroup.UpdatePolicy indicating that upgrades are done externally, and we should disable automatic upgrades
UpdatePolicyExternal = "external" UpdatePolicyExternal = "external"
// DiscoveryLabelKey is the label we use for services that should be exposed internally.
// Endpoints get the same labels as their services.
DiscoveryLabelKey = "discovery.kops.k8s.io/internal-name"
) )

View File

@ -9,13 +9,16 @@ go_library(
"priority.go", "priority.go",
"visitor.go", "visitor.go",
"volumes.go", "volumes.go",
"yaml.go",
], ],
importpath = "k8s.io/kops/pkg/kubemanifest", importpath = "k8s.io/kops/pkg/kubemanifest",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//util/pkg/text:go_default_library", "//util/pkg/text:go_default_library",
"//vendor/gopkg.in/yaml.v2:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library",
"//vendor/sigs.k8s.io/yaml:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library",
], ],

69
pkg/kubemanifest/yaml.go Normal file
View File

@ -0,0 +1,69 @@
/*
Copyright 2021 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package kubemanifest
import (
"encoding/json"
"fmt"
yamlv2 "gopkg.in/yaml.v2"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/klog/v2"
)
// KubeObjectToApplyYAML returns the kubernetes object converted to YAML, with "noisy" fields removed.
//
// We remove:
// * status (can't be applied, shouldn't be specified)
// * metadata.creationTimestamp (can't be applied, shouldn't be specified)
func KubeObjectToApplyYAML(data runtime.Object) (string, error) {
// This logic is inlined sigs.k8s.io/yaml.Marshal, but we delete some fields in the middle.
// Convert the object to JSON bytes
j, err := json.Marshal(data)
if err != nil {
return "", fmt.Errorf("error marshaling into JSON: %v", err)
}
// Convert the JSON to a map.
jsonObj := make(map[string]interface{})
if err := yamlv2.Unmarshal(j, &jsonObj); err != nil {
return "", err
}
// Remove status (can't be applied, shouldn't be specified)
delete(jsonObj, "status")
// Remove metadata.creationTimestamp (can't be applied, shouldn't be specified)
metadataObj, found := jsonObj["metadata"]
if found {
if metadata, ok := metadataObj.(map[interface{}]interface{}); ok {
delete(metadata, "creationTimestamp")
} else {
klog.Warningf("unexpected type for object metadata: %T", metadataObj)
}
} else {
klog.Warningf("object did not have metadata: %#v", jsonObj)
}
// Marshal the cleaned-up map into YAML.
y, err := yamlv2.Marshal(jsonObj)
if err != nil {
return "", err
}
return string(y), nil
}

View File

@ -265,10 +265,8 @@ func (b *EtcdManagerBuilder) buildPod(etcdCluster kops.EtcdClusterSpec) (*v1.Pod
} else { } else {
clientHost = "__name__" clientHost = "__name__"
} }
clientPort := 4001
clusterName := "etcd-" + etcdCluster.Name clusterName := "etcd-" + etcdCluster.Name
peerPort := 2380
backupStore := "" backupStore := ""
if etcdCluster.Backups != nil { if etcdCluster.Backups != nil {
backupStore = etcdCluster.Backups.BackupStore backupStore = etcdCluster.Backups.BackupStore
@ -287,12 +285,9 @@ func (b *EtcdManagerBuilder) buildPod(etcdCluster kops.EtcdClusterSpec) (*v1.Pod
if pod.Labels == nil { if pod.Labels == nil {
pod.Labels = make(map[string]string) pod.Labels = make(map[string]string)
} }
pod.Labels["k8s-app"] = pod.Name for k, v := range SelectorForCluster(etcdCluster) {
pod.Labels[k] = v
// TODO: Use a socket file for the quarantine port }
quarantinedClientPort := wellknownports.EtcdMainQuarantinedClientPort
grpcPort := wellknownports.EtcdMainGRPC
// The dns suffix logic mirrors the existing logic, so we should be compatible with existing clusters // The dns suffix logic mirrors the existing logic, so we should be compatible with existing clusters
// (etcd makes it difficult to change peer urls, treating it as a cluster event, for reasons unknown) // (etcd makes it difficult to change peer urls, treating it as a cluster event, for reasons unknown)
@ -307,20 +302,19 @@ func (b *EtcdManagerBuilder) buildPod(etcdCluster kops.EtcdClusterSpec) (*v1.Pod
dnsInternalSuffix = ".internal." + b.Cluster.ObjectMeta.Name dnsInternalSuffix = ".internal." + b.Cluster.ObjectMeta.Name
} }
ports, err := PortsForCluster(etcdCluster)
if err != nil {
return nil, err
}
switch etcdCluster.Name { switch etcdCluster.Name {
case "main": case "main":
clusterName = "etcd" clusterName = "etcd"
case "events": case "events":
clientPort = 4002 // ok
peerPort = 2381
grpcPort = wellknownports.EtcdEventsGRPC
quarantinedClientPort = wellknownports.EtcdEventsQuarantinedClientPort
case "cilium": case "cilium":
clientPort = 4003
peerPort = 2382
grpcPort = wellknownports.EtcdCiliumGRPC
quarantinedClientPort = wellknownports.EtcdCiliumQuarantinedClientPort
if !featureflag.APIServerNodes.Enabled() { if !featureflag.APIServerNodes.Enabled() {
clientHost = b.Cluster.Spec.MasterInternalName clientHost = b.Cluster.Spec.MasterInternalName
} }
@ -343,7 +337,7 @@ func (b *EtcdManagerBuilder) buildPod(etcdCluster kops.EtcdClusterSpec) (*v1.Pod
Containerized: true, Containerized: true,
ClusterName: clusterName, ClusterName: clusterName,
BackupStore: backupStore, BackupStore: backupStore,
GrpcPort: grpcPort, GrpcPort: ports.GRPCPort,
DNSSuffix: dnsInternalSuffix, DNSSuffix: dnsInternalSuffix,
} }
@ -361,9 +355,9 @@ func (b *EtcdManagerBuilder) buildPod(etcdCluster kops.EtcdClusterSpec) (*v1.Pod
{ {
scheme := "https" scheme := "https"
config.PeerUrls = fmt.Sprintf("%s://__name__:%d", scheme, peerPort) config.PeerUrls = fmt.Sprintf("%s://__name__:%d", scheme, ports.PeerPort)
config.ClientUrls = fmt.Sprintf("%s://%s:%d", scheme, clientHost, clientPort) config.ClientUrls = fmt.Sprintf("%s://%s:%d", scheme, clientHost, ports.ClientPort)
config.QuarantineClientUrls = fmt.Sprintf("%s://__name__:%d", scheme, quarantinedClientPort) config.QuarantineClientUrls = fmt.Sprintf("%s://__name__:%d", scheme, ports.QuarantinedGRPCPort)
// TODO: We need to wire these into the etcd-manager spec // TODO: We need to wire these into the etcd-manager spec
// // add timeout/heartbeat settings // // add timeout/heartbeat settings
@ -573,3 +567,50 @@ type config struct {
VolumeNameTag string `flag:"volume-name-tag"` VolumeNameTag string `flag:"volume-name-tag"`
DNSSuffix string `flag:"dns-suffix"` DNSSuffix string `flag:"dns-suffix"`
} }
// SelectorForCluster returns the selector that should be used to select our pods (from services)
func SelectorForCluster(etcdCluster kops.EtcdClusterSpec) map[string]string {
return map[string]string{
"k8s-app": "etcd-manager-" + etcdCluster.Name,
}
}
type Ports struct {
ClientPort int
PeerPort int
GRPCPort int
QuarantinedGRPCPort int
}
// PortsForCluster returns the ports that the cluster users.
func PortsForCluster(etcdCluster kops.EtcdClusterSpec) (Ports, error) {
switch etcdCluster.Name {
case "main":
return Ports{
GRPCPort: wellknownports.EtcdMainGRPC,
// TODO: Use a socket file for the quarantine port
QuarantinedGRPCPort: wellknownports.EtcdMainQuarantinedClientPort,
ClientPort: 4001,
PeerPort: 2380,
}, nil
case "events":
return Ports{
GRPCPort: wellknownports.EtcdEventsGRPC,
QuarantinedGRPCPort: wellknownports.EtcdEventsQuarantinedClientPort,
ClientPort: 4002,
PeerPort: 2381,
}, nil
case "cilium":
return Ports{
GRPCPort: wellknownports.EtcdCiliumGRPC,
QuarantinedGRPCPort: wellknownports.EtcdCiliumQuarantinedClientPort,
ClientPort: 4003,
PeerPort: 2382,
}, nil
default:
return Ports{}, fmt.Errorf("unknown etcd cluster key %q", etcdCluster.Name)
}
}

View File

@ -0,0 +1,18 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["template_functions.go"],
importpath = "k8s.io/kops/pkg/model/components/kopscontroller",
visibility = ["//visibility:public"],
deps = [
"//pkg/apis/kops:go_default_library",
"//pkg/dns:go_default_library",
"//pkg/featureflag:go_default_library",
"//pkg/model/components/etcdmanager:go_default_library",
"//pkg/wellknownports:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
],
)

View File

@ -0,0 +1,132 @@
/*
Copyright 2021 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package kopscontroller
import (
"text/template"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/dns"
"k8s.io/kops/pkg/featureflag"
"k8s.io/kops/pkg/model/components/etcdmanager"
"k8s.io/kops/pkg/wellknownports"
)
// AddTemplateFunctions registers template functions for KopsController
func AddTemplateFunctions(cluster *kops.Cluster, dest template.FuncMap) {
t := &templateFunctions{
Cluster: cluster,
}
dest["KopsController"] = func() *templateFunctions {
return t
}
}
// templateFunctions implements the KopsController template object helper.
type templateFunctions struct {
Cluster *kops.Cluster
}
// KopsControllerConfig returns the yaml configuration for kops-controller
func (t *templateFunctions) GossipServices() ([]*corev1.Service, error) {
if !dns.IsGossipHostname(t.Cluster.Name) {
return nil, nil
}
suffix := t.Cluster.Name
var services []*corev1.Service
// api service
{
service := buildHeadlessService(types.NamespacedName{Name: "api-internal", Namespace: "kube-system"})
service.Spec.Ports = []corev1.ServicePort{
{Name: "https", Port: 443, Protocol: corev1.ProtocolTCP},
}
service.Spec.Selector = map[string]string{
"k8s-app": "kops-controller",
}
service.Labels = map[string]string{
kops.DiscoveryLabelKey: "api.internal." + suffix,
}
services = append(services, service)
}
// kops-controller service
{
service := buildHeadlessService(types.NamespacedName{Name: "kops-controller-internal", Namespace: "kube-system"})
service.Spec.Ports = []corev1.ServicePort{
{Name: "https", Port: wellknownports.KopsControllerPort, Protocol: corev1.ProtocolTCP},
}
service.Spec.Selector = map[string]string{
"k8s-app": "kops-controller",
}
service.Labels = map[string]string{
kops.DiscoveryLabelKey: "kops-controller.internal." + suffix,
}
services = append(services, service)
}
// etcd services
if featureflag.APIServerNodes.Enabled() {
for _, etcdCluster := range t.Cluster.Spec.EtcdClusters {
name := "etcd-" + etcdCluster.Name + "-internal"
service := buildHeadlessService(types.NamespacedName{Name: name, Namespace: "kube-system"})
ports, err := etcdmanager.PortsForCluster(etcdCluster)
if err != nil {
return nil, err
}
service.Spec.Ports = []corev1.ServicePort{
{Name: "https", Port: int32(ports.ClientPort), Protocol: corev1.ProtocolTCP},
}
service.Labels = map[string]string{
kops.DiscoveryLabelKey: etcdCluster.Name + ".etcd." + suffix,
}
service.Spec.Selector = etcdmanager.SelectorForCluster(etcdCluster)
services = append(services, service)
}
}
// We set the target port, to make applying cleaner
for _, service := range services {
for i := range service.Spec.Ports {
port := &service.Spec.Ports[i]
if port.TargetPort == intstr.FromInt(0) {
port.TargetPort = intstr.FromInt(int(port.Port))
}
}
}
return services, nil
}
// buildHeadlessService is a helper to build a headless service
func buildHeadlessService(name types.NamespacedName) *corev1.Service {
s := &corev1.Service{}
s.APIVersion = "v1"
s.Kind = "Service"
s.Name = name.Name
s.Namespace = name.Namespace
s.Spec.ClusterIP = corev1.ClusterIPNone
s.Spec.Type = corev1.ServiceTypeClusterIP
return s
}

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: e4297ef11985ee4a7c4e8707453a8d2c16bcb12eccc050adffac3e6ac2fb9a18 manifestHash: 262fb03230d0c4a72a9579736b4bc8fdf04e676b8e417790d08c14b4ff03198d
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: e4297ef11985ee4a7c4e8707453a8d2c16bcb12eccc050adffac3e6ac2fb9a18 manifestHash: 262fb03230d0c4a72a9579736b4bc8fdf04e676b8e417790d08c14b4ff03198d
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: e4297ef11985ee4a7c4e8707453a8d2c16bcb12eccc050adffac3e6ac2fb9a18 manifestHash: 262fb03230d0c4a72a9579736b4bc8fdf04e676b8e417790d08c14b4ff03198d
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: e31327420b42b8d1b813625c65601166c52b054ae9ac95a57048d72e70b7033c manifestHash: 63d09ebb456eb06d694bce805fda8888754e5250eb6a37c120146bbf6f655af4
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: e31327420b42b8d1b813625c65601166c52b054ae9ac95a57048d72e70b7033c manifestHash: 63d09ebb456eb06d694bce805fda8888754e5250eb6a37c120146bbf6f655af4
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: e31327420b42b8d1b813625c65601166c52b054ae9ac95a57048d72e70b7033c manifestHash: 63d09ebb456eb06d694bce805fda8888754e5250eb6a37c120146bbf6f655af4
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: e31327420b42b8d1b813625c65601166c52b054ae9ac95a57048d72e70b7033c manifestHash: 63d09ebb456eb06d694bce805fda8888754e5250eb6a37c120146bbf6f655af4
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -6,7 +6,7 @@ spec:
addons: addons:
- id: k8s-1.16 - id: k8s-1.16
manifest: kops-controller.addons.k8s.io/k8s-1.16.yaml manifest: kops-controller.addons.k8s.io/k8s-1.16.yaml
manifestHash: a2b7d85f845283e6a2e41036215e8b27c7808b199e0d613bcf3d1d40dd2f653b manifestHash: 9379d3b1d4508369654ace436cf45137009a50ff1b0e73b88dac88350ebefabd
name: kops-controller.addons.k8s.io name: kops-controller.addons.k8s.io
needsRollingUpdate: control-plane needsRollingUpdate: control-plane
selector: selector:
@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 237badcf1d7899f372b94c7f6b3d7dbb0c48bc490d8cbbb9f8d90ed5e1ecb6b3
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -80,6 +80,10 @@ data:
fallthrough in-addr.arpa ip6.arpa fallthrough in-addr.arpa ip6.arpa
ttl 30 ttl 30
} }
hosts /etc/coredns/hosts k8s.local {
ttl 30
fallthrough
}
prometheus :9153 prometheus :9153
forward . /etc/resolv.conf { forward . /etc/resolv.conf {
max_concurrent 1000 max_concurrent 1000
@ -200,9 +204,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -1,7 +1,7 @@
apiVersion: v1 apiVersion: v1
data: data:
config.yaml: | config.yaml: |
{"cloud":"aws","configBase":"memfs://clusters.example.com/minimal.k8s.local","server":{"Listen":":3988","provider":{"aws":{"nodesRoles":["nodes.minimal.k8s.local"],"Region":"us-test-1"}},"serverKeyPath":"/etc/kubernetes/kops-controller/pki/kops-controller.key","serverCertificatePath":"/etc/kubernetes/kops-controller/pki/kops-controller.crt","caBasePath":"/etc/kubernetes/kops-controller/pki","signingCAs":["kubernetes-ca"],"certNames":["kubelet","kubelet-server","kube-proxy"]}} {"cloud":"aws","configBase":"memfs://clusters.example.com/minimal.k8s.local","server":{"Listen":":3988","provider":{"aws":{"nodesRoles":["nodes.minimal.k8s.local"],"Region":"us-test-1"}},"serverKeyPath":"/etc/kubernetes/kops-controller/pki/kops-controller.key","serverCertificatePath":"/etc/kubernetes/kops-controller/pki/kops-controller.crt","caBasePath":"/etc/kubernetes/kops-controller/pki","signingCAs":["kubernetes-ca"],"certNames":["kubelet","kubelet-server","kube-proxy"]},"discovery":{"enabled":true}}
kind: ConfigMap kind: ConfigMap
metadata: metadata:
creationTimestamp: null creationTimestamp: null
@ -119,6 +119,14 @@ rules:
- list - list
- watch - watch
- patch - patch
- apiGroups:
- ""
resources:
- endpoints
verbs:
- get
- list
- watch
--- ---
@ -185,6 +193,16 @@ rules:
- leases - leases
verbs: verbs:
- create - create
- apiGroups:
- ""
resourceNames:
- coredns
resources:
- configmaps
verbs:
- get
- watch
- patch
--- ---
@ -206,3 +224,51 @@ subjects:
- apiGroup: rbac.authorization.k8s.io - apiGroup: rbac.authorization.k8s.io
kind: User kind: User
name: system:serviceaccount:kube-system:kops-controller name: system:serviceaccount:kube-system:kops-controller
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
addon.kops.k8s.io/name: kops-controller.addons.k8s.io
app.kubernetes.io/managed-by: kops
discovery.kops.k8s.io/internal-name: api.internal.minimal.k8s.local
k8s-addon: kops-controller.addons.k8s.io
name: api-internal
namespace: kube-system
spec:
clusterIP: None
ports:
- name: https
port: 443
protocol: TCP
targetPort: 443
selector:
k8s-app: kops-controller
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
addon.kops.k8s.io/name: kops-controller.addons.k8s.io
app.kubernetes.io/managed-by: kops
discovery.kops.k8s.io/internal-name: kops-controller.internal.minimal.k8s.local
k8s-addon: kops-controller.addons.k8s.io
name: kops-controller-internal
namespace: kube-system
spec:
clusterIP: None
ports:
- name: https
port: 3988
protocol: TCP
targetPort: 3988
selector:
k8s-app: kops-controller
type: ClusterIP

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

View File

@ -200,9 +200,6 @@ spec:
operator: Exists operator: Exists
volumes: volumes:
- configMap: - configMap:
items:
- key: Corefile
path: Corefile
name: coredns name: coredns
name: config-volume name: config-volume

View File

@ -20,7 +20,7 @@ spec:
version: 9.99.0 version: 9.99.0
- id: k8s-1.12 - id: k8s-1.12
manifest: coredns.addons.k8s.io/k8s-1.12.yaml manifest: coredns.addons.k8s.io/k8s-1.12.yaml
manifestHash: 88ffe1a3752cf290450cc94bd53aea49a665e411dbf4cfe9c1a2cc5b027f12ef manifestHash: 12b67f439637253329bf6fb2ee23b3ef65959621720c863263c13da8271bff89
name: coredns.addons.k8s.io name: coredns.addons.k8s.io
selector: selector:
k8s-addon: coredns.addons.k8s.io k8s-addon: coredns.addons.k8s.io

Some files were not shown because too many files have changed in this diff Show More