Kubernetes PodのCapabilities

KubernetesにPodを作るとき,securityContextフィールドにコンテナの各種capabilitiesを追加,あるいは削除することができます. 例えば下のようなPodサンプルYamlファイルがあります. $ tee capabilities-pod.yaml <<-'EOF' apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: myshell image: "ubuntu:14.04" command: - /bin/sleep - "300" securityContext: capabilities: add: - NET_ADMIN <<---- これ EOF $ kubectl create -f capability-test-pod.yaml # Podを作る pod "mypod" created $ kubectl exec mypod -- capsh --print # コンテナのcapabilitiesの中にやはりcap_net_admin出てきた Current: = ...,cap_net_admin, ..., cap_setfcap+eip ... capsh --printコマンドはコンテナのcapabilitiesを表示させるコマンドです. そもそも Container Capabilitiesはなんですか? それを気になって,調べていました. Linux Capabilities Container Capabilitiesを説明する前にまずLinux Capabilitiesを知る必要があります. Linux Kernel 2.

client-goでKubernetesのIngress Ruleを作る

JenkinsXのコマンドを検証しているうちに、うまく動作しない部分もあって、どうやってプログラムで、Ingress Ruleを作ること気になったので、ちょっとやってみました。 client-goライブラリを利用して、以下のようなKubernetesのIngress Ruleを作成します。 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-rule-created-from-go namespace: default spec: backend: serviceName: nginx servicePort: 80 rules: - host: nginx.my.domain 上の情報に基づいて、Ingress Ruleを作成するのに以下のの情報を指定すると作成できます。 apiVersion kind metadata spec.backend.serviceName spec.backend.servicePort rules.host Ingress Ruleを作るのにGoのライブラリのドキュメントはかなり役に立っています。ドキュメントを参照して、必要なものを正しい形で指定すれば良いです。 package main import ( "fmt" v1beta1 "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "log" "os" "path/filepath" "reflect" ) func main() { // kubernetesの設定ファイルのパスを組み立てる kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config") config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) if err !

kubectlでPodを作成のプロセス

kubectlでPodを作成する際に、Kubernetesの中で何か起こっているかをわかりやすく説明見つけたので、メモしておく。 https://medium.com/jorgeacetozi/kubernetes-master-components-etcd-api-server-controller-manager-and-scheduler-3a0179fc8186 kubectl writes to the API Server. API Server validates the request and persists it to etcd. etcd notifies back the API Server. API Server invokes the Scheduler. Scheduler decides where to run the pod on and return that to the API Server. API Server persists it to etcd. etcd notifies back the API Server. API Server invokes the Kubelet in the corresponding node. Kubelet talks to the Docker daemon using the API over the Docker socket to create the container.

KubernetesのServiceを監視するコントローラ

やりたいことはclient-goというオフィシャルのKubernetesのクライアントを利用して、KubernetesのServiceの作成、削除、更新を監視することです。 ファイル名: watch_service.go package main import ( "flag" "fmt" "github.com/golang/glog" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" "path/filepath" "time" ) func main() { var kubeconfig *string home := homedir.HomeDir() kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "optional) absolute path to the kubeconfig file") flag.Parse() config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { glog.Fatal(err) } clientset, err := kubernetes.NewForConfig(config) if err != nil { glog.Fatal(err) } watchlist := cache.NewListWatchFromClient( clientset.CoreV1().RESTClient(), string(v1.ResourceServices), v1.

Jenkins XをKubernetesにインストールする際のコマンド

事前に用意しているKubernetesクラスターはIDCFクラウド上で作られている。Nginx Ingress ControllerとMetallbがインストール済み。Metallbを使うとLoadBalancer タイプのNginx Ingress Controller Serviceが作られる。 Jenkins XがこのLoadBalancer タイプのIngress Controllerが必要としている。 Jenkins XをKubernetesクラスターにインストールする際のコマンドは以下のようになる。 jx install \ --exposer='Ingress' \ --ingress-namespace='ingress-nginx' \ --ingress-service='ingress-nginx' \ --ingress-cluster-role='nginx-ingress-clusterrole' \ --ingress-deployment='nginx-ingress-controller' \ --namespace='jx' \ --provider='kubernetes' \ --default-environment-prefix='ravengeode' --git-api-token='xxxxxxxxxxxxxxxxxxxx' --git-api-tokenオプションは下のリンクから作成することができる。 https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo

Pod中からKubernetesのAPI Serverに認証

概要 やりたいことは簡単のアプリケーションを作って、Kubernetesの中にPodとしてデプロイして、このアプリは現在Kubernetesクラスター中に何個のPodがあるかをKubernetesのApi Serverに問い合わせる。 つまりPodの中のアプリケーションはどうやってKubernetesのAPI Serverに認証して、情報を取得することである。 このアプリを作るためにKubernetesのclient-goライブラリを使います。サンプルとしてここに載っています。Pod内からKubernetesのApi Serverと通信するための認証部分の設定は rest.InClusterConfig()を呼び出すことになる。 プログラム作成 ファイル名はin-cluster-client-configuration.go package main import ( "fmt" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func main() { // creates the in-cluster config config, err := rest.InClusterConfig() if err != nil { panic(err.Error()) } // creates the clientset clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) } for { pods, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{}) if err != nil { panic(err.Error()) } fmt.

Kubernetesに既存のDeploymentをGolangで削除

KubernetesのDeploymentを削除するときにDeletionPropagationを設定する必要があるようです。 ソースコードにDeletionPropagationの説明は DeletionPropagation decides if a deletion will propagate to the dependents of the object, and how the garbage collector will handle the propagation. DeletionPropagationはForegroundの場合 The object exists in the key-value store until the garbage collector deletes all the dependents whose ownerReference.blockOwnerDeletion=true from the key-value store. API sever will put the “foregroundDeletion” finalizer on the object, and sets its deletionTimestamp. This policy is cascading, i.e., the dependents will be deleted with Foreground.

client-goでKubernetesのAPIを試す

概要 Kubernetesのclient-goクライアントを利用して、クラスターへの操作を色々試す。 Nodeの取得 package main import ( "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "log" "os" "path/filepath" ) func main() { // kubernetesの設定ファイルのパスを組み立てる kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config") // BuildConfigFromFlags is a helper function that builds configs from a master url or // a kubeconfig filepath. config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) if err != nil { log.Fatal(err) } // NewForConfig creates a new Clientset for the given config. // https://godoc.