服务器规划
| 服务器名称 | 服务器IP | 安装的软件 | 角色 |
|---|---|---|---|
| linux-node2 | 192.168.56.12 | kube-apiserver、kube-controller-manager、 kube-scheduler、etcd | master |
| linux-node3 | 192.168.56.13 | kubelet、proxy、docker | node |
配置推荐
| 软硬件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU和内存 | Master:至少1core和2G内存。 Node:至少1core和2G内存 | Master:2core和4G内存 Node:由于要运行Docker,所以根据需要进行调整 |
| Docker | 1.9版本及以上 | 1.12版本 |
| ETCD | 2.0版本及以上 | 3.0版本 |
配置域名解析
# cat >>/etc/hosts <<EOF 192.168.56.12 linux-node2 192.168.56.13 linux-node3 EOF
安装桥接工具
# yum install bridge-utils -y
配置Limitations
# cat >/etc/sysctl.d/k8s.conf<<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # sysctl -p etc/sysctl.d/k8s.conf
安装并配置etcd
安装
# yum install etcd -y # egrep -v "#|^$" etc/etcd/etcd.conf ETCD_NAME=default ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME
etcd的名称ETCD_DATA_DIR
etcd的数据目录ETCD_LISTEN_CLIENT_URLS
客户端连接端口ETCD_ADVERTISE_CLIENT_URLS
分布式连接端口
启动
# systemctl enable etcd # systemctl start etcd
检查
# etcdctl cluster-health
设置一个kv,给kubernetes使用
# etcdctl mkdir /biglittleant.cn/network # etcdctl mk /biglittleant.cn/network/config '{ "Network": "10.10.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }' { "Network": "10.10.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
查看
# etcdctl -o extended get /biglittleant.cn/network/config Key: /biglittleant.cn/network/config Created-Index: 293299 Modified-Index: 293299 TTL: 0 Index: 293319 { "Network": "10.10.0.0/16" }
安装配置 master 节点
安装配置
# yum install kubernetes-master flannel docker -y # egrep -v "#|^$" /etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBELET_PORT="--kubelet-port=10250" KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.56.12:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" KUBE_API_ARGS=""
--insecure-bind-address
api监听地址.--insecure-port
api监听端口.--service-cluster-ip-range
上面说到service角色是定义集群中一个pod集合,这个pod中容器提供一种服务,当创建service时会分配一个CLUSTER_IP提供统一的访问入口,那么,这个选项就是指定分配的IP范围.以CIDI格式表示,例如:192.168.0.0/16,该IP范围不能与物理机的真实IP段有重合。--etcd_servers
:指定etcd连接地址.--admission-control
中删除,ServiceAccount. kubernetes集群的准入控制设置,各控制模块以插件的形式依次生效。--service-node-prot-range
kubernetes集群中Server可映射的物理机端口号范围,默认为3000~32767--log-dir=/var/log/kubernetes --v
日志级别 定义日志位置及日志级别。
# egrep -v "#|^$" /etc/kubernetes/controller-manager KUBE_CONTROLLER_MANAGER_ARGS="--node-monitor-grace-period=10s --pod-eviction-timeout=10s"
# egrep -v "#|^$" /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.56.12:8080"
参数说明
cotroller 依赖于apiserver--master=http://192.168.56.12:8080
: api的URL--logtostderr=false
: 设置为false表示将日志写入文件,不写入stdeer--log-dir=/var/log/kubernetes
: 日志目录--v = 2
: 日志级别
启动服务
# systemctl enable kube-apiserver kube-scheduler kube-controller-manager # systemctl start kube-apiserver kube-scheduler kube-controller-manager
检查服务器端是否正常启动
# ss -lntup |egrep "kube|etcd" tcp LISTEN 0 128 127.0.0.1:2380 *:* users:(("etcd",3143,5)) tcp LISTEN 0 128 :::6443 :::* users:(("kube-apiserver",3290,50)) tcp LISTEN 0 128 :::10251 :::* users:(("kube-scheduler",3295,7)) tcp LISTEN 0 128 :::2379 :::* users:(("etcd",3143,6)) tcp LISTEN 0 128 :::10252 :::* users:(("kube-controller",3291,5)) tcp LISTEN 0 128 :::8080 :::* users:(("kube-apiserver",3290,51))
配置 flannel网络
# egrep -v "#|^$" /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://192.168.56.12:2379" FLANNEL_ETCD_PREFIX="/biglittleant.cn/network" # systemctl enable flanneld # systemctl restart flanneld docker
安装配置 node 节点
安装
# yum install kubernetes-node flannel docker -y egrep -v "#|^$" /etc/kubernetes/config KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.56.12:8080"
配置
# egrep -v "#|^$" /etc/kubernetes/kubelet KUBELET_ADDRESS="--address=0.0.0.0" KUBELET_PORT="--port=10250" KUBELET_HOSTNAME="--hostname-override=192.168.56.13" KUBELET_API_SERVER="--api-servers=http://192.168.56.12:8080" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS=""
参数说明
kubelet 依赖于docker --api-servers:指定apiserver的URL,可以指定多个 --hostname-override:设置本node的名称 --logtostderr=false 设置为false表示将日志写入文件,不写入stdeer --log-dir=/var/log/kubernetes 日志目录 --v = 2 日志级别
启动
# systemctl enable kubelet kube-proxy # systemctl start kubelet kube-proxy
# egrep -v "#|^$" /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://192.168.56.12:2379" FLANNEL_ETCD_PREFIX="/biglittleant.cn/network"
# systemctl enable flanneld # systemctl restart flanneld docker
检查集群中master能够看到node
# kubectl get nodes NAME STATUS AGE 192.168.56.13 Ready 17s
如果配置错误可以删除当前节点重新添加
# kubectl delete nodes 127.0.0.1 node "127.0.0.1" deleted
可以查看该node节点的详细信息
# kubectl describe node 192.168.56.13
在Master节点查看flannel子网分配情况。
# etcdctl ls /biglittleant.cn/network /biglittleant.cn/network/subnets /biglittleant.cn/network/config
手动启动kubernetes容器
创建deployment
创建
# kubectl run hello-world --replicas=2 --labels="run=load-balancer-example" --image=docker.io/nginx --port=8080 deployment "hello-world" created
上述命令将创建一个Deployment对象和一个关联的ReplicaSet对象。 ReplicaSet有两个Pod,每个都运行nginx应用程序。
Deployment会自动帮你创建pod和replicasets。
查看Deployment的信息
# kubectl get deployments hello-world # kubectl describe deployments hello-world
查看replicasets的信息
# kubectl get replicasets # kubectl describe replicasets
使用 describe 查看详细信息
创建一个对外服务的Service对象
创建
# kubectl expose deployment hello-world --type=NodePort --name=example-service
查看刚才services的信息
# kubectl describe services example-service
输出信息如下:bash Name: example-service Namespace: default Labels: run=load-balancer-example Selector: run=load-balancer-example Type: NodePort IP: 10.254.21.162 Port: <unset> 8080/TCP NodePort: <unset> 32187/TCP Endpoints: <none> Session Affinity: None No events.
这里需要注意的是,Service使用的是虚拟IP地址,因些无法ping通过;但访问8080端口时,可以访问到对应的资源。
列出运行hello word的pod
kubectl get pods --selector="run=load-balancer-example" --output=wide NAME READY STATUS ... IP NODE hello-world-2895499144-bsbk5 1/1 Running ... 10.200.1.4 worker1 hello-world-2895499144-m1pwt 1/1 Running ... 10.200.2.5 worker2
kubernetes的event概念,event是一个事件的记录,记录了事件的最早产生时间、最后重现时间、重复次数、发起者、类型以及导致此事件的原因等众多信息。当我们发现某个pod迟迟不能启动时,可以使用kubectl describe pod xxx 来查看他的描述信息,来定位问题。
flannel原理解释
flannel
使用etcd
存储配置数据和子网分配信息。flannel
启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。
通过查看/biglittleant.cn/network/subnets
这个目录中获取已经注册的网段。
flannel
使用etcd
的watch
机制监视/biglittleant.cn/network/subnets
下面所有元素的变化信息,并且根据他来维护一个路由表。为了提高性能,flannel
优化了Universal TAP/TUN
设备,对TUN
和UDP
之间的ip分片做了代理。
# etcdctl ls /biglittleant.cn/network/subnets /biglittleant.cn/network/subnets/10.10.47.0-24 /biglittleant.cn/network/subnets/10.10.61.0-24
7: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500 link/none inet 10.10.61.0/16 scope global flannel0 valid_lft forever preferred_lft forever
31: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500 link/none inet 10.10.47.0/16 scope global flannel0 valid_lft forever preferred_lft forever
从上面的IP可以看出每个flannel会获得一个IP端
flannel会获取/24的网段,所有/biglittleant.cn/network这个网段最好设置大网段
除了flannel网络以为还可以配置open vSwitch 或者直接路由(使用Quagga来实现路由规则的动态添加)。





