Zainstalowałem Kubernetes na Bare-metal/Ubuntu. Jestem na 6b649d7f9f2b09ca8b0dd8c0d3e14dcb255432d1
commit w git. Użyłem cd kubernetes/cluster; KUBERNETES_PROVIDER=ubuntu ./kube-up.sh
, a następnie cd kubernetes/cluster/ubuntu; ./deployAddons.sh
, aby uruchomić klaster. Wszystko poszło dobrze, a gromada się podniosła.Nie można pingować ClusterIP z wewnątrz bloku, a system DNS nie działa w przypadku domen zewnętrznych, takich jak google.com.
My /ubuntu/config-default.sh
się następująco:
# Define all your cluster nodes, MASTER node comes first"
# And separated with blank space like <[email protected]_1> <[email protected]_2> <[email protected]_3>
export nodes=${nodes:-"[email protected] [email protected]"}
# Define all your nodes role: a(master) or i(minion) or ai(both master and minion), must be the order same
role=${role:-"ai i"}
# If it practically impossible to set an array as an environment variable
# from a script, so assume variable is a string then convert it to an array
export roles=($role)
# Define minion numbers
export NUM_NODES=${NUM_NODES:-2}
# define the IP range used for service cluster IPs.
# according to rfc 1918 ref: https://tools.ietf.org/html/rfc1918 choose a private ip range here.
export SERVICE_CLUSTER_IP_RANGE=${SERVICE_CLUSTER_IP_RANGE:-192.168.3.0/24} # formerly PORTAL_NET
# define the IP range used for flannel overlay network, should not conflict with above SERVICE_CLUSTER_IP_RANGE
export FLANNEL_NET=${FLANNEL_NET:-172.16.0.0/16}
# Optionally add other contents to the Flannel configuration JSON
# object normally stored in etcd as /coreos.com/network/config. Use
# JSON syntax suitable for insertion into a JSON object constructor
# after other field name:value pairs. For example:
# FLANNEL_OTHER_NET_CONFIG=', "SubnetMin": "172.16.10.0", "SubnetMax": "172.16.90.0"'
export FLANNEL_OTHER_NET_CONFIG
FLANNEL_OTHER_NET_CONFIG=''
# Admission Controllers to invoke prior to persisting objects in cluster
export ADMISSION_CONTROL=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,SecurityContextDeny
# Path to the config file or directory of files of kubelet
export KUBELET_CONFIG=${KUBELET_CONFIG:-""}
# A port range to reserve for services with NodePort visibility
SERVICE_NODE_PORT_RANGE=${SERVICE_NODE_PORT_RANGE:-"30000-32767"}
# Optional: Enable node logging.
ENABLE_NODE_LOGGING=false
LOGGING_DESTINATION=${LOGGING_DESTINATION:-elasticsearch}
# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.
ENABLE_CLUSTER_LOGGING=false
ELASTICSEARCH_LOGGING_REPLICAS=${ELASTICSEARCH_LOGGING_REPLICAS:-1}
# Optional: When set to true, heapster, Influxdb and Grafana will be setup as part of the cluster bring up.
ENABLE_CLUSTER_MONITORING="${KUBE_ENABLE_CLUSTER_MONITORING:-true}"
# Extra options to set on the Docker command line. This is useful for setting
# --insecure-registry for local registries.
DOCKER_OPTS=${DOCKER_OPTS:-""}
# Extra options to set on the kube-proxy command line. This is useful
# for selecting the iptables proxy-mode, for example.
KUBE_PROXY_EXTRA_OPTS=${KUBE_PROXY_EXTRA_OPTS:-""}
# Optional: Install cluster DNS.
ENABLE_CLUSTER_DNS="${KUBE_ENABLE_CLUSTER_DNS:-true}"
# DNS_SERVER_IP must be a IP in SERVICE_CLUSTER_IP_RANGE
DNS_SERVER_IP=${DNS_SERVER_IP:-"192.168.3.10"}
DNS_DOMAIN=${DNS_DOMAIN:-"cluster.local"}
DNS_REPLICAS=${DNS_REPLICAS:-1}
# Optional: Install Kubernetes UI
ENABLE_CLUSTER_UI="${KUBE_ENABLE_CLUSTER_UI:-true}"
# Optional: Enable setting flags for kube-apiserver to turn on behavior in active-dev
RUNTIME_CONFIG="--basic-auth-file=password.csv"
# Optional: Add http or https proxy when download easy-rsa.
# Add envitonment variable separated with blank space like "http_proxy=http://10.x.x.x:8080 https_proxy=https://10.x.x.x:8443"
PROXY_SETTING=${PROXY_SETTING:-""}
DEBUG=${DEBUG:-"false"}
Potem stworzyli kapsułę stosując następujący plik yml:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
i usługę za pomocą następującego yml:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 8000
targetPort: 80
protocol: TCP
selector:
app: nginx
type: NodePort
Następnie dostałem się do uruchomionego terminalu kontenerowego za pomocą docker exec -it [CONTAINER_ID] bash
. Występują głównie dwa problemy:
- Nie mogę pingować domen zewnętrznych, takich jak google.com, ale mogę pingować zewnętrzne adresy IP, takie jak 8.8.8.8. Pojemnik ma dostęp do Internetu.
- Usługi wewnętrzne rozwiązują problemy z wewnętrznymi ClusterIP, ale nie mogę wysłać tego adresu z wnętrza kontenera.
gospodarza /etc/resolve.conf
plik jest następujący:
nameserver 8.8.8.8
nameserver 127.0.1.1
kontenera /etc/resolve.conf
plik jest następujący:
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 192.168.3.10
nameserver 8.8.8.8
nameserver 127.0.1.1
options ndots:5
odniesieniu do pierwszego problemu, myślę, że może to być związane zarówno SkyDNS misserfigurarion serwera nazw lub niestandardową konfigurację, którą muszę wykonać, ale nie jestem tego świadomy.
Jednak nie mam pojęcia, dlaczego pojemniki nie mogą pingować ClusterIP.
Jakiekolwiek obejścia?
Okazuje się, że routing ruchu odbywa się za pomocą 'iptables' na podstawie pary' (ip, port) '. Tak więc wirtualny adres IP nie można pingować, ale jest dostępny przez ten konkretny port. Nadal problem z DNS pozostaje. –