EDIT:私のセットアップの全体的なポイントは、(可能な場合)以下を達成することです:
Docker(古い)Swarmセットアップをk8sに移動できるかどうかを評価するために、小さなKubernetesクラスター(kubeadmで構築)を実行しています。絶対に必要な機能は、MacVlanで行うように、コンテナにIPを割り当てる機能です。
現在のdockerセットアップでは、MacVlanを使用して会社のネットワークからいくつかのコンテナーにIPアドレスを割り当てているため、物理サーバーのように(リバースプロキシなしで)直接アクセスできます。私はk8sで似たようなことを達成しようとしています。
そうだと分かった:
私のyamlファイルは次のとおりです。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
externalIPs:
- A.B.C.D
私のサービスがIP A.B.C.D(会社のネットワークの1つ)を取得することを期待していました。 ClusterIPを使用してk8sクラスター内からnginxコンテナーに到達できるため、私の展開は機能しています。
私は何が欠けていますか?または、少なくとも、パケットが来ているかどうかを確認するために、ネットワークトラフィックに関する情報をどこで見つけることができますか?
[〜#〜] edit [〜#〜]:
$ kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.96.0.1 <none> 443/TCP 6d
nginx-service 10.102.64.83 A.B.C.D 80/TCP 23h
ありがとう。
これが単なるテスト用の場合は、試してください
kubectl port-forward service/nginx-service 80:80
その後、次のことができます
curl http://localhost:80
(テストだけでなく、に欠点はありますが)動作する可能性のある解決策は、Podを設定して、ホストネットワークをhostNetwork
specフィールドはtrue
に設定されています。
それは、単一のポート(マニフェストで指定したcontainerPort
)を介してホスト上で常にアクセスできるため、Podを公開するためのサービスが不要であることを意味します。その場合、DNSマッピングレコードを保持する必要はありません。
これは、特定のノードでこのPodの単一のインスタンスしか実行できないことも意味します(欠点について話します...)。そのため、 DaemonSet オブジェクトの適切な候補になります。
Podが引き続き内部Kubernetesホスト名にアクセス/解決する必要がある場合は、dnsPolicy
specフィールドセットをClusterFirstWithNoHostNet
に設定する必要があります。この設定により、ポッドがK8S DNSサービスにアクセスできるようになります。
例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx-reverse-proxy
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
tolerations: # allow a Pod instance to run on Master - optional
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- image: nginx
name: nginx
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
編集: ingress-nginx documentation のおかげでこのトラックに入れられました
外部IPにパッチを適用できます
CMD:$ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'
例:-$ kubectl patch svc kubernetes -p '{"spec":{"externalIPs":["10.2.8.19"]}}'
まず、次のコマンドを実行します。
kubectl get -n namespace services
上記のコマンドは、次のような出力を返します。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 <none> 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 <none> 3000:30017/TCP 13h
上記の出力から、外部IPがまだサービスに割り当てられていないことが明らかです。外部IPをbackend serviceに割り当てるには、次のコマンドを実行します。
kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
外部IPをfrontend serviceに割り当てるには、このコマンドを実行します。
kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
次に、名前空間サービスを取得して、外部IPの割り当てを確認します。
kubectl get -n namespace services
次のような出力が得られます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 192.168.0.194 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 192.168.0.194 3000:30017/TCP 13h
乾杯!!! Kubernetes外部IPが割り当てられました。
kube-keepalived-vip構成を試して、トラフィックをルーティングできます。 https://github.com/kubernetes/contrib/tree/master/keepalived-vip
サービスのyamlファイルに「type:NodePort」を追加すると、Webブラウザーまたは外部からアクセスするためのポートが作成されます。私の場合、それは役に立ちました。