概念
kube-dns
- 解决的问题
不是kubernetes中必须安装的,但是推荐安装
虽然kubernetes中有service的概念,访问服务可以访问端口,
但是如果是一个app,一个db,
链接db时需要通过增加app查询ip的能力,需要重复的开发,修改应用
刚开始的做法采用了docker使用过的方法--环境变量。
每个pod启动时,会通过环境变量设置所有服务的ip与port,
这样pod中的应用可以启动时,读取环境变量来获取依赖服务的地址信息
,但是,一个问题是,必须依赖服务先启动才可以正常使用
最理想的方案就是直接使用服务的名字,不需要关心它实际的ip,即dns系统。
kubernetes 也提供了这种功能
- 存在的形态
DNS服务不是独立的系统,是一种 addon 作为插件来安装,可以把它看做运行在集群上的应用。
DNS 有两种配置方式: - 在1.3之前使用 etcd + kube2sky + skydns 的方式
会有三个容器运行:
etcd: 保存所有DNS数据
kube2sky: 通过kubernetes API 监听 Service 的变化, 然后同步到 etcd
skyDNS: 根据etcd中的数据,对外提供DNS查询服务
- 在1.3之后可以使用 kubedns + dnsmasq 的方式
kubedns: 提供原来kube2sky + etcd + skyDNS 的功能,可以单独对外提供DNS查询服务
dnsmasq: 轻量级的DNS服务软件, 可以提供DNS缓存功能。 kubeDNS模式下,dnsmasq正在内存这种预留一块大小1G(默认)的地方,保存当前最常用的DNS查询记录, 如果缓存中没有要查找的记录,就会到kubeDNS中查询,并把结果缓存起来.
离线安装
环境
- vagrant 虚拟三台机器
- centos7.2
步骤
- 指定gcr.io的host,如果不指定需要手动下载google-containers
61.91.161.217 google.com
61.91.161.217 gcr.io
61.91.161.217 www.gcr.io
61.91.161.217 console.cloud.google.com
61.91.161.217 storage.googleapis.com
- 关闭防火墙
$ vi /etc/selinux/config
SELINUX=permissive
$ setenforce 0
$ getenforce
Ppermission
$ systemctl stop firewalld
$ systemctl disable firewalld
- Docker会随着kubernetes安装,删除本地docker
$ yum list installed | docker
$ yum remove -y docekr-engine.x86_64 docekr-engine-selinux.noarch
- 开始安装kubernetes,离线源采用cbs.centos.org/repos/$tag/x86_64/os/Packages/ tag=virt7-docker-common-candidate
# 删除本机repo
$ rm -rf /etc/yum.repos.d/$tag.repo
$ yum install -y createrepo
$ mkdir -p /data/softs/localyum 将下载的软件全部放入该文件夹内
$ createrepo -v /data/softs/localyum
# enable=1 表示启用这个更新库
# gpgcheck=1 表示使用gpg文件检查软件包签名
# gpgkey= 表示gpg文件所在位置,此处也可以有http方式的位置
$ cat << EOF >> /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///data/softs/localyum
enable=1
gpgcheck=0
EOF
$ yum clean all
$ yum makecache
$ yum install -y kubernetes flannel etcd
- 配置docker
# 修改docker配置 sed -i:改变输入文件 -r:使用正则表达式
$ rm -rf /etc/systemd/system/docker.service.d/docker.conf
$ cat /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker-containerd.service
Wants=docker-storage-setup.service
Requires=docker-containerd.service rhel-push-plugin.socket
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/dockerd-current \
--add-runtime oci=/usr/libexec/docker/docker-runc-current \
--default-runtime=oci \
--authorization-plugin=rhel-push-plugin \
--containerd /run/containerd.sock \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
$ sed -ir 's/^OPTION.*/OPTIONS=''"'"'--selinux-enabled --log-driver=journald --graph=\/data\/env\/docker --insecure-registry master:5000'"'"'/' /etc/sysconfig/docker
$ mkdir -p /data/env/docker
$ systemctl enable docker && systemctl restart docker
# 查询docker状态
$ systemctl status docker
- 配置kubernetes
# 备份kubernetes配置
$ mv /etc/kubernetes/config /etc/kubernetes/config.bak
$ vi /etc/kubernetes/config
KUBE_ETCD_SERVERS="--etcd-servers=http://kubemaster:2379"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://kubemaster:8080"
- master 配置etcd, kubernetes, flanneld, kube-apiserver, kube-controller-manager, kube-scheduler
$ mv /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
$ vi /etc/etcd/etcd.conf
# [member]
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
#[cluster]
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
$ mv /etc/kubernetes/apiserver /etc/kubernetes/apiserver.bak
$ vi /etc/kubernetes/apiserver
# The address on the local server to listen to.
KUBE_API_ADDRESS="--address=0.0.0.0"
# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"
# Port kubelets listen on
KUBELET_PORT="--kubelet-port=10250"
# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
# Add your own!
KUBE_API_ARGS=""
$ systemctl start etcd
$ etcdctl mkdir /kube-centos/network
$ etcdctl mk /kube-centos/network/config "{ \"Network\": \"172.30.0.0/16\", \"SubnetLen\": 24, \"Backend\": { \"Type\": \"vxlan\" } }"
{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
$ mv /etc/sysconfig/flanneld/ /etc/sysconfig/flanneld.bak
$ vi /etc/sysconfig/flanneld
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://kubemaster:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/kube-centos/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
$ for SERVICES in etcd kube-apiserver kube-controller-manager kube-cheduler flanneld; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
- node节点上配置kubernetes(every node)
$ mv /etc/kubernetes/kubelet /etc/kubernetes/kubelet.bak
$ vi /etc/kubernetes/kubelet
# The address for the info server to serve on
KUBELET_ADDRESS="--address=0.0.0.0"
# The port for the info server to serve on
KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
# Check the node number!
KUBELET_HOSTNAME="--hostname-override=kubenode0"
# Location of the api-server
KUBELET_API_SERVER="--api-servers=http://kubemaster:8080"
# Add your own!
KUBELET_ARGS=""
- node节点上配置flanneld
$ mv /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
$ vi /etc/sysconfig/flanneld
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://kubemaster:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/kube-centos/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
- node节点上启动服务
$ for SERVICES in kube-proxy kubelet flanneld docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
$ ps -ef | grep kube
root 2976 1 3 15:10 ? 00:00:00 /usr/bin/kube-proxy --logtostderr=true --v=0 --master=http://kubemaster:8080
root 3063 1 0 15:10 ? 00:00:00 /usr/bin/flanneld -etcd-endpoints=http://kubemaster:2379 -etcd-prefix=/kube-centos/network
root 3214 1 5 15:10 ? 00:00:00 /usr/bin/kubelet --logtostderr=true --v=0 --api-servers=http://kubemaster:8080 --address=0.0.0.0 --port=10250 --hostname-override=kubenode0 --allow-privileged=false
root 3357 2569 0 15:10 pts/0 00:00:00 grep --color=auto kube
# Configure kubectl
$ kubectl config set-cluster default-cluster --server=http://kubemaster:8080
$ kubectl config set-context default-context --cluster=default-cluster --user=default-admin
$ kubectl config use-context default-context
- 查看集群状态
$ kubectl cluster-info
Kubernetes master is running at http://localhost:8080
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get deployment --namespace=kube-system
No resources found.
# exec every machine useful
$ kubectl get nodes
NAME STATUS AGE
kubenode0 Ready 4m
kubenode1 Ready 2m
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"2017-01-19T19:39:41Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"2017-01-19T19:39:41Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
现在你可以用windows访问:http://192.168.1.158:8080/api/:
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "192.168.1.158:6443"
}
]
}
访问https://192.168.1.158:6443/api:
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "192.168.1.158:6443"
}
]
}
参考资料
#tomorrow continue
遇到问题
-