Sau khi sài istio thì mình thấy cách mà istio thêm container “istio=proxy” vào trong 1 pod của 1 workload.
Cái này khá là hay.
Mình thử mò trên mạng sem có anh nào demo làm được việc này ko?
Và bạn có thể tham khảo repo này!
https://github.com/morvencao/kube-sidecar-injector
Lý do mình chọn repo trên thì ảnh code bằng golang và đến thới điểm hiện tại (Sun, Mar 13th, 2022) thì mình thấy team của anh vần còn cập nhật!
Mình cũng chưa soi từng dòng code để hiểu họ run ntn?
Nhưng sẽ note 1 vài thứ để ý nếu chúng ta muốn custom như ý mình.
Ở file main.go
Đầu tiên mình thấy chạy dòng này!
Như mình hay chỉnh istio thì mình thấy có 2 phần này là quan trong:
NamespaceSelector
NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook. For example, to run the webhook on any objects whose namespace is not associated with “runlevel” of “0” or “1”; you will set the selector as follows:
"namespaceSelector":
{
"matchExpressions": [
{
"key": "runlevel",
"operator": "NotIn",
"values": [
"0",
"1"
]
}
]
}
If instead you want to only run the webhook on any objects whose namespace is associated with the “environment” of “prod” or “staging”; you will set the selector as follows:
"namespaceSelector":
{
"matchExpressions": [
{
"key": "environment",
"operator": "In",
"values": [
"prod",
"staging"
]
}
]
}
See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors. Default to the empty LabelSelector, which matches everything. +optional NamespaceSelector
on pkg.go.dev
Anh đó có chỉ lệnh make.
Nhưng mà gõ nó ko chạy!
Đại loại sau khi sửa xong thig bạn build image và push lên docker hub
>>>>>>
docker build -t nimtechnology/sidecar-injector:latest --force-rm -f Dockerfile .
>>>>>>
docker push nimtechnology/sidecar-injector:latest
Tiếp theo là deploy:
https://github.com/morvencao/kube-sidecar-injector/tree/master/deploy
https://github.com/morvencao/kube-sidecar-injector/blob/master/deploy/deployment.yaml#L20
Giờ bạn tạo namespace mới và pod nằm trên namespace đó:
kubectl create ns test-ns
kubectl label namespace test-ns sidecar-injection=enabled
kubectl -n test-ns run alpine \
--image=alpine \
--restart=Never \
--command -- sleep infinity
Bạn để ý pod sẽ được inject thêm container nginx
Bạn để ý configmap trong mấy file manifest ở thư mục deploy là sẽ hiểu
https://github.com/morvencao/kube-sidecar-injector/blob/master/deploy/configmap.yaml
trường hợp pod cứ ở namespace test-ns là inject cũng ko hay lắm!
ObjectSelector
Case của chúng ta phải có 2 điều kiện:
– workload ở trong ns đã được sidecar-injection=enabled
– workload cần có khai báo 1 label nào đó thì mới inject container.
LabelSelector
MatchExpressions
Một cách khác với label
https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#LabelSelectorOperator
Annotation.
chúng ta thấy thường các application istio, vault, …
thì khi chúng ta add annotion thì pod sẽ được inject-container.
https://github.com/morvencao/kube-sidecar-injector/blob/master/cmd/webhook.go#L75-L106
Mình check thì mặc định là sẽ vẫn inject container.
Còn nếu sidecar-injector-webhook.nimtechnology.com/inject là false or not or off or n: thì sẽ ko inject
bạn có thể sửa lại chỗ này nếu bạn cần custom liên quan đến annotation