暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes入门实战之部署

DevOps视角 2017-09-05
12

服务器规划

服务器名称服务器IP安装的软件角色
linux-node2192.168.56.12kube-apiserver、kube-controller-manager、 kube-scheduler、etcdmaster
linux-node3192.168.56.13kubelet、proxy、dockernode

配置推荐

软硬件最低配置推荐配置
CPU和内存Master:至少1core和2G内存。 Node:至少1core和2G内存Master:2core和4G内存 Node:由于要运行Docker,所以根据需要进行调整
Docker1.9版本及以上1.12版本
ETCD2.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来实现路由规则的动态添加)。



文章转载自DevOps视角,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论