设为首页 收藏本站
查看: 1856|回复: 0

[经验分享] How-to setup Kubernetes to manage Docker Cluster on ubuntu-Suzf Blog-51CTO博客

[复制链接]

尚未签到

发表于 2018-9-16 07:53:57 | 显示全部楼层 |阅读模式
什么是 Kubernetes
  Kubernetes 是来自 Google 云平台的开源容器集群管理系统。基于 Docker 构建一个容器的调度服务。该系统可以自动在一个容器集群中选择一个工作容器供使用。其核心概念是 Container Pod。详细的设计思路请参考这里。
  关于 Kubernetes 系统架构及组件介绍见 这里。
  本文通过实际操作来演示Kubernetes的使用,主要包括如下内容:

  •   部署环境介绍,以及Kubernetes集群逻辑架构
  •   安装部署Open vSwitch跨机器容器通信工具
  •   安装部署Etcd和Kubernetes的各大组件
  •   演示Kubernetes管理容器和服务
部署环境及架构

  •   操作系统: ubuntu 14.04 x86_64
  •   Kubernetes: v1.0.1
  •   Etcd版本: 3.0.0
  •   Docker版本: 1.6.2
  •   Open vSwith版本: 2.0.2
  •   主机信息
  •   服务器信息:
  • Role         service                                  Hostname         IP Address  
    master       Kube-APIServer kubelet proxy etcd        lucy.suzf.net    172.16.9.86
      
    Minion1      kubelet proxy open-switch docker         eva.suzf.net     172.16.9.10
      
    Minion2      kubelet proxy open-switch docker         cali.suzf.net    172.16.9.20
  在详细介绍部署Kubernetes集群前,先给大家展示下集群的逻辑架构。从下图可知,整个系统分为两部分,第一部分是Kubernetes
APIServer,是整个系统的核心,承担集群中所有容器的管理工作;第二部分是minion,运行Container
Daemon,是所有容器栖息之地,同时在minion上运行Open vSwitch程序,通过GRE
Tunnel负责minions之间Pod的网络通信工作。

http://suzf.net 纯手工锻造 欢迎关注与交流  ^_^
安装Open vSwitch及配置GRE
  为了解决跨minion之间Pod的通信问题,我们在每个minion上安装Open
vSwtich,并使用GRE或者VxLAN使得跨机器之间P11od能相互通信,本文使用GRE,而VxLAN通常用在需要隔离的大规模网络中。对于
Open vSwitch的介绍请参考另一篇文章Open vSwitch。
[ both minion ]  
sudo apt-get install openvswitch-switch bridge-utils -y
  安装完Open vSwitch和桥接工具后,接下来便建立minion节点之间的隧道。
  首先在所有minion上分别建立OVS Bridge:
sudo ovs-vsctl add-br obr0  接下来建立gre,并将新建的gre0添加到obr0
# minion1  
sudo ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=172.16.3.20
  

  
# minion2
  
sudo ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=172.16.3.10
  至此,minion1和minion2之间的隧道已经建立。然后我们在minion1和minion2上创建Linux网桥kbr0替代
Docker默认的docker0(我们假设minion1和minion2都已安装Docker),设置minion1的kbr0的地址为
172.17.1.1/24,
minion2的kbr0的地址为172.17.2.1/24,并添加obr0为kbr0的接口,以下命令在minion1和minion2上执行:
[ both minion ]  
# sudo brctl addbr kbr0               # 创建linux bridge代替docker0
  
# sudo brctl addif kbr0 obr0          # 添加obr0为kbr0的接口
  
# # sudo ip link set dev obr0 up        # 设置obr0为up状态
  
# sudo ip link set dev docker0 down   # 设置docker0为down状态
  
# sudo ip link del dev docker0        # 删除docker0,可选
  查看这些接口的状态
# service openvswitch-switch status  
openvswitch-switch start/running
  
@eva:~# ovs-vsctl show
  
52c65487-12fc-4228-b2ee-7c5ba409d8d2
  
    Bridge "obr0"
  
        Port "gre0"
  
            Interface "gre0"
  
                type: gre
  
                options: {remote_ip="172.16.3.20"}
  
        Port "obr0"
  
            Interface "obr0"
  
                type: internal
  
    ovs_version: "2.0.2"
  

  
@eva:~#  brctl show
  
bridge name    bridge id        STP enabled    interfaces
  
kbr0        8000.de14d8a90948    no        obr0
  为了使新建的kbr0在每次系统重启后任然有效,我们在minion1的/etc/network/interfaces文件中
  追加内容如下:(在CentOS上会有些不一样)
@eva:~# tail -9  /etc/network/interfaces  

  
auto kbr0
  
iface kbr0 inet static
  
    address 172.16.1.1
  
    netmask 255.255.255.0
  
    # gateway 172.16.1.0
  
    # dns-nameservers 172.31.1.1
  
    up route add 172.16.2.0/24 via 172.16.3.20 dev eth0
  
    down route add 172.16.2.0/24 via 172.16.3.20 dev eth0
  minion2 网卡配置类似 。然后 启动虚拟网络接口
sudo ip link set dev obr0 up  你能在minion1和minion2上发现kbr0都设置了相应的IP地址。
  这是我们创建的隧道还不能通信。经查找这是因为在minion1和minion2上缺少访问172.17.2.1和172.17.1.1的路由,因此我们需要添加路由保证彼此之间能通信:
# minion1 上执行  
sudo ip route add 172.16.2.0/24 via 172.16.3.20 dev eth0
  

  
# minion2 上执行
  
sudo ip route add 172.16.1.0/24 via 172.16.3.10 dev eth0
  现在网络之间可以正常通信了
@eva:~# ping 172.16.2.1 -c 2  
PING 172.16.2.1 (172.16.2.1) 56(84) bytes of data.
  
64 bytes from 172.16.2.1: icmp_seq=1 ttl=64 time=0.714 ms
  
64 bytes from 172.16.2.1: icmp_seq=2 ttl=64 time=0.337 ms
  

  
--- 172.16.2.1 ping statistics ---
  
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
  
rtt min/avg/max/mdev = 0.337/0.525/0.714/0.189 ms
  

  

  
@cali:~# ping 172.16.1.1 -c 2
  
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
  
64 bytes from 172.16.1.1: icmp_seq=1 ttl=64 time=0.577 ms
  
64 bytes from 172.16.1.1: icmp_seq=2 ttl=64 time=0.269 ms
  

  
--- 172.16.1.1 ping statistics ---
  
2 packets transmitted, 2 received, 0% packet loss, time 999ms
  
rtt min/avg/max/mdev = 0.269/0.423/0.577/0.154 ms
  Minion 节点安装 docker
[ both minion ]  
sudo apt-get install docker.io -y
  修改docker默认桥接网桥,并重启
sudo vi /etc/default/docker  
DOCKER_OPTS="-b kbr0"
  

  
sudo service docker restart
Etcd  安装与配置
  etcd是一个开源的用于配置共享和服务发现的高性能的键值存储系统。
  注意:创建存放所有组件二进制文件目录,最好是/opt/bin目录,因为启动脚本里面写的就是这个目录。
@lucy:~# cd /usr/local/src/  
@lucy:/usr/local/src#sudo wget https://github.com/coreos/etcd/releases/download/v3.0.0/etcd-v3.0.0-linux-amd64.tar.gz
  
tar xf etcd-v3.0.0-linux-amd64.tar.gz
  
cd etcd-v3.0.0-linux-amd64/
  
mkdir /opt/bin
  
cp -a etcd etcdctl /opt/bin
  etcd官方建议使用新的2379端口代替4001
cat >  /etc/default/etcd @lucy:~# cd /usr/local/src/  
@lucy:/usr/local/src#sudo wget https://github.com/coreos/etcd/releases/download/v3.0.0/etcd-v3.0.0-linux-amd64.tar.gz
  
@lucy:/usr/local/src#sudo wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v1.0.1/kubernetes.tar.gz
  然后解压下载的kubernetes和etcd包,并在kubernetes(minion1)、minion2上创建目录/opt/bin
[ All nodes ]  
# mkdir /opt/bin
  
# echo "export PATH=\$PATH:/opt/bin" >> /etc/profile
  
# source /etc/profile
  解压kubernetes
tar xf kubernetes.tar.gz  
cd kubernetes/server && tar xf kubernetes-server-linux-amd64.tar.gz
  
cd kubernetes/server/bin/
  APIserver本身需要的是kube-apiserver kube-scheduler kube-controller-manager kubecfg四个
@lucy #cp kube-apiserver kube-scheduler kube-controller-manager kubecfg  /opt/bin/  把proxy和kubelet复制到其他minions,确保这些文件都是可执行的
scp kube-proxy kubelet root@eva.suzf.net:/opt/bin  
scp kube-proxy kubelet root@cali.suzf.net:/opt/bin
  拷贝相关组件启动脚本
cd /usr/local/src/kubernetes/cluster/ubuntu  
@lucy:/usr/local/src/kubernetes/cluster/ubuntu# cp master/init_scripts/* /etc/init.d/
  
@lucy:/usr/local/src/kubernetes/cluster/ubuntu# cp master/init_conf/* /etc/init/
  配置kube*启动选项
# kube-apiserver  
cat > /etc/default/kube-apiserver  /etc/default/kube-scheduler  /etc/default/kube-controller-manager  /etc/default/kubelet  /etc/default/kube-proxy > $ETCD_LOGFILE 2>&1追加日志这部分再启动试试。
  

  
@lucy:~# /etc/init.d/kube-apiserver start
  
* Kube-Apiserver is managed via upstart, try using service kube-apiserver start
  

  
What are you 弄啥嘞? 查看一下etcd 的启动脚本 发现少一个判断
  
@lucy:~# sed -n '36,39'p /etc/init.d/etcd
  
# see also init_is_upstart in /lib/lsb/init-functions (which isn't available in Ubuntu 12.04, or we'd use it)
  
if false && [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | grep -q upstart; then
  
log_failure_msg "$ETCD_DESC is managed via upstart, try using service $BASE $1"
  
exit 1
  
@lucy:~# sed -n '36,39'p /etc/init.d/kube-apiserver
  
# see also init_is_upstart in /lib/lsb/init-functions (which isn't available in Ubuntu 12.04, or we'd use it)
  
if [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | grep -q upstart; then
  
log_failure_msg "$KUBE_APISERVER_DESC is managed via upstart, try using service $BASE $1"
  
exit 1
  

  
加上判断在试一试, 呵呵  好了~
  
@lucy:~# service kube-apiserver  start
  
kube-apiserver start/running, process 4222
  

  
kube-apiserver启动后会自动运行kube-scheduler、kube-controller-manager
  

  
这些服务的日志可以从/var/log/upstart/中找到。
  
lucy:~# ls /var/log/upstart/kube-*
  
/var/log/upstart/kube-apiserver.log  /var/log/upstart/kube-controller-manager.log  /var/log/upstart/kube-scheduler.log
  可以通过etcdctl查看到etcd存储着关于集群的各种信息
@lucy:~# etcdctl ls /registry  
/registry/minions
  
/registry/namespaces
  
/registry/pods
  
/registry/ranges
  
/registry/serviceaccounts
  
/registry/services
  
/registry/controllers
  
/registry/events
  启动 minion 节点 服务
[ both minion ]  
# service kube-proxy start
  
# service kubelet start
  到这 kubernetes 就配置完了,查看下集群节点:

  kubernetes常用命令
# kubectl get nodes                       # 查查看minion主机  
# kubectl get pods                        # 查看pods清单
  
# kubectl get services                    # 查看service清单
  
# kubectl get services -o json            # 查看service清单 以 json 形式输出
  
# kubectl get replicationControllers      # 查看replicationControllers清单
  
# for i in `kubectl get pod|tail -n +2|awk '{print $1}'`; do kubectl delete pod $i; done   #删除所有pods
  或者通过Server api for REST方式(推荐,及时性更高)
kubernetes 测试
  命令启动一个nginx:
# kubectl run --image=nginx nginx-test-by-suzf-net  
replicationcontroller "nginx-test-by-suzf-net" created
  初次创建要下载镜像,需等待数分钟,查看集群pods:
# kubectl get pods  
NAME                           READY     STATUS    RESTARTS   AGE
  
nginx-test-by-suzf-net-uepzq   1/1       Running   0          8h
  使用yaml 文件创建 pod
root@lucy:~# cat nginx-pod.yaml  
apiVersion: v1
  
kind: Pod
  
metadata:
  
    name: nginx
  
    labels:
  
        app: nginx
  
spec:
  
    containers:
  
        - name: nginx
  
          image: nginx
  
          ports:
  
              - containerPort: 80
  

  

  
root@lucy:~# kubectl create -f nginx-pod.yaml
  
pods/nginx
  
root@lucy:~# kubectl get pod
  
NAME                         READY STATUS   RESTARTS AGE
  
nginx                        1/1   Running  0        29s
  
nginx-test-by-suzf-net-uepzq 1/1   Running  0        8h
  查看下创建的nginx信息

  访问一下 试试

  当然我们也可以使用Kubernetes提供的例子Guestbook(下载的源码example目录下可以找到)来做测试。
  至此,kubernetes集群就部署成功了。欢迎继续关注 ^_^.
  参考文档
  http://kubernetes.io/docs/getting-started-guides/ubuntu/
  http://lizhenliang.blog.51cto.com/7876557/1736572
  http://blog.liuts.com/post/247/
  https://segmentfault.com/a/1190000002620961
  License:Attribution-NonCommercial-NoDerivatives 4.0 International
  本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
  转载请注明出处:http://suzf.net/thread-0702-951.html



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-584318-1-1.html 上篇帖子: Configure a Highly Available Kubernetes / etcd Cluster with Pacemaker on Fedora 下篇帖子: Kubernetes 集群的两种部署过程(daemon部署和容器化部署)以及glusterfs的应用!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表