二、基础集群部署 - kubernetes-simple

1. 部署ETCD(主节点)

1.1 简介

kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等。都需要持久化。etcd就是它的数据中心。生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点。我们这里以学习为主就只在主节点部署一个实例。

如果你的环境已经有了etcd服务(不管是单点还是集群),可以忽略这一步。前提是你在生成配置的时候填写了自己的etcd endpoint哦~

1.2 部署

etcd的二进制文件和服务的配置我们都已经准备好,现在的目的就是把它做成系统服务并启动。

  1. #把服务配置文件copy到系统服务目录
  2. $ cp ~/kubernetes-starter/target/master-node/etcd.service /lib/systemd/system/
  3. #enable服务
  4. $ systemctl enable etcd.service
  5. #创建工作目录(保存数据的地方)
  6. $ mkdir -p /var/lib/etcd
  7. # 启动服务
  8. $ service etcd start
  9. # 查看服务日志,看是否有错误信息,确保服务正常
  10. $ journalctl -f -u etcd.service
  11. $ etcdctl -C http://10.0.94.112:2379 cluster-health
  12. member 8e9e05c52164694d is healthy: got healthy result from http://10.0.94.112:2379
  13. cluster is healthy

2. 部署APIServer(主节点)

2.1 简介

kube-apiserver是Kubernetes最重要的核心组件之一,主要提供以下的功能

  • 提供集群管理的REST API接口,包括认证授权(我们现在没有用到)数据校验以及集群状态变更等
  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)

生产环境为了保证apiserver的高可用一般会部署2+个节点,在上层做一个lb做负载均衡,比如haproxy。由于单节点和多节点在apiserver这一层说来没什么区别,所以我们学习部署一个节点就足够啦

2.2 部署

APIServer的部署方式也是通过系统服务。部署流程跟etcd完全一样,不再注释

  1. $ cp target/master-node/kube-apiserver.service /lib/systemd/system/
  2. $ systemctl enable kube-apiserver.service
  3. $ systemctl daemon-reload
  4. $ service kube-apiserver start
  5. $ journalctl -f -u kube-apiserver

2.3 重点配置说明

[Unit]
Description=Kubernetes API Server
...
[Service]
#可执行文件的位置
ExecStart=/home/michael/bin/kube-apiserver \
#非安全端口(8080)绑定的监听地址 这里表示监听所有地址
--insecure-bind-address=0.0.0.0 \
#不使用https
--kubelet-https=false \
#kubernetes集群的虚拟ip的地址范围
--service-cluster-ip-range=10.68.0.0/16 \
#service的nodeport的端口范围限制
--service-node-port-range=20000-40000 \
#很多地方都需要和etcd打交道,也是唯一可以直接操作etcd的模块
--etcd-servers=http://192.168.1.102:2379\
...

3. 部署ControllerManager(主节点)

3.1 简介

Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。 kube-controller-manager由一系列的控制器组成,像Replication Controller控制副本,Node Controller节点控制,Deployment Controller管理deployment等等 cloud-controller-manager在Kubernetes启用Cloud Provider的时候才需要,用来配合云服务提供商的控制

controller-manager、scheduler和apiserver 三者的功能紧密相关,一般运行在同一个机器上,我们可以把它们当做一个整体来看,所以保证了apiserver的高可用即是保证了三个模块的高可用。也可以同时启动多个controller-manager进程,但只有一个会被选举为leader提供服务。

3.2 部署

通过系统服务方式部署

  1. $ cp target/master-node/kube-controller-manager.service /lib/systemd/system/
  2. $ systemctl enable kube-controller-manager.service
  3. $ service kube-controller-manager start
  4. $ journalctl -f -u kube-controller-manager

3.3 重点配置说明

[Unit]
Description=Kubernetes Controller Manager
...
[Service]
ExecStart=/home/michael/bin/kube-controller-manager \
#对外服务的监听地址,这里表示只有本机的程序可以访问它
--address=127.0.0.1 \
#apiserver的url
--master=http://127.0.0.1:8080\
#服务虚拟ip范围,同apiserver的配置
--service-cluster-ip-range=10.68.0.0/16 \
#pod的ip地址范围
--cluster-cidr=172.20.0.0/16 \
#下面两个表示不使用证书,用空值覆盖默认值
--cluster-signing-cert-file= \
--cluster-signing-key-file= \
...

4. 部署Scheduler(主节点)

4.1 简介

kube-scheduler负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。我们前面讲到的kubernetes的各种调度策略就是它实现的。

4.2 部署

通过系统服务方式部署

  1. $ cp target/master-node/kube-scheduler.service /lib/systemd/system/
  2. $ systemctl enable kube-scheduler.service
  3. $ service kube-scheduler start
  4. $ journalctl -f -u kube-scheduler

4.3 重点配置说明

[Unit]
Description=Kubernetes Scheduler
...
[Service]
ExecStart=/home/michael/bin/kube-scheduler \
#对外服务的监听地址,这里表示只有本机的程序可以访问它
--address=127.0.0.1 \
#apiserver的url
--master=http://127.0.0.1:8080\
...

5. 部署CalicoNode(所有节点)

5.1 简介

Calico实现了CNI接口,是kubernetes网络方案的一种选择,它一个纯三层的数据中心网络方案(不需要Overlay),并且与OpenStack、Kubernetes、AWS、GCE等IaaS和容器平台都有良好的集成。 Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。 这样保证最终所有的workload之间的数据流量都是通过IP路由的方式完成互联的。

5.2 部署

calico是通过系统服务+docker方式完成的

  1. $ cp target/all-node/kube-calico.service /lib/systemd/system/
  2. $ systemctl enable kube-calico.service
  3. $ service kube-calico start
  4. $ journalctl -f -u kube-calico

5.3 calico可用性验证

查看容器运行情况

  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED ...
  3. 4d371b58928b calico/node:v2.6.2
  4. "
  5. start_runit
  6. "
  7. 3 hours ago...

查看节点运行情况

  1. $ calicoctl node status
  2. Calico process is running.
  3. IPv4 BGP status
  4. +---------------+-------------------+-------+----------+-------------+
  5. |
  6. PEER ADDRESS
  7. |
  8. PEER TYPE
  9. |
  10. STATE
  11. |
  12. SINCE
  13. |
  14. INFO
  15. |
  16. +---------------+-------------------+-------+----------+-------------+
  17. |
  18. 192.168.1.103
  19. |
  20. node-to-node mesh
  21. |
  22. up
  23. |
  24. 13:13:13
  25. |
  26. Established
  27. |
  28. +---------------+-------------------+-------+----------+-------------+
  29. IPv6 BGP status
  30. No IPv6 peers found.

查看端口BGP 协议是通过TCP 连接来建立邻居的,因此可以用netstat 命令验证 BGP Peer

  1. $ netstat -natp
  2. |
  3. grep ESTABLISHED
  4. |
  5. grep 179
  6. tcp 0 0 192.168.1.102:60959 192.168.1.103:179 ESTABLISHED 29680/bird

查看集群ippool情况

  1. $ calicoctl get ipPool -o yaml
  2. - apiVersion: v1
  3. kind: ipPool
  4. metadata:
  5. cidr: 172.20.0.0/16
  6. spec:
  7. nat-outgoing:
  8. true

5.4 重点配置说明

[Unit]
Description=calico node
...
[Service]
#以docker方式运行
ExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node \
#指定etcd endpoints(这里主要负责网络元数据一致性,确保Calico网络状态的准确性)
-e ETCD_ENDPOINTS=http://192.168.1.102:2379\
#网络地址范围(同上面ControllerManager)
-e CALICO_IPV4POOL_CIDR=172.20.0.0/16 \
#镜像名,为了加快大家的下载速度,镜像都放到了阿里云上
registry.cn-hangzhou.aliyuncs.com/imooc/calico-node:v2.6.2

6. 配置kubectl命令(任意节点)

6.1 简介

kubectl是Kubernetes的命令行工具,是Kubernetes用户和管理员必备的管理工具。 kubectl提供了大量的子命令,方便管理Kubernetes集群中的各种功能。

6.2 初始化

使用kubectl的第一步是配置Kubernetes集群以及认证方式,包括:

  • cluster信息:api-server地址
  • 用户信息:用户名、密码或密钥
  • Context:cluster、用户信息以及Namespace的组合

我们这没有安全相关的东西,只需要设置好api-server和上下文就好啦:

  1. #指定apiserver地址(ip替换为你自己的api-server地址)
  2. kubectl config set-cluster kubernetes --server=http://10.0.94.112:8080
  3. #指定设置上下文,指定cluster
  4. kubectl config set-context kubernetes --cluster=kubernetes
  5. #选择默认的上下文
  6. kubectl config use-context kubernetes

通过上面的设置最终目的是生成了一个配置文件:~/.kube/config,当然你也可以手写或复制一个文件放在那,就不需要上面的命令了。

7. 配置kubelet(工作节点)

7.1 简介

每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源。

7.2 部署

通过系统服务方式部署,但步骤会多一些,具体如下:

  1. #确保相关目录存在
  2. $ mkdir -p /var/lib/kubelet
  3. $ mkdir -p /etc/kubernetes
  4. $ mkdir -p /etc/cni/net.d
  5. #复制kubelet服务配置文件
  6. $ cp target/worker-node/kubelet.service /lib/systemd/system/
  7. #复制kubelet依赖的配置文件
  8. $ cp target/worker-node/kubelet.kubeconfig /etc/kubernetes/
  9. #复制kubelet用到的cni插件配置文件
  10. $ cp target/worker-node/10-calico.conf /etc/cni/net.d/
  11. $ systemctl enable kubelet.service
  12. $ service kubelet start
  13. $ journalctl -f -u kubelet

7.3 重点配置说明

kubelet.service

[Unit]
Description=Kubernetes Kubelet
[Service]
#kubelet工作目录,存储当前节点容器,pod等信息
WorkingDirectory=/var/lib/kubelet
ExecStart=/home/michael/bin/kubelet \
#对外服务的监听地址
--address=192.168.1.103 \
#指定基础容器的镜像,负责创建Pod 内部共享的网络、文件系统等,这个基础容器非常重要:K8S每一个运行的 POD里面必然包含这个基础容器,如果它没有运行起来那么你的POD 肯定创建不了
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/imooc/pause-amd64:3.0 \
#访问集群方式的配置,如api-server地址等
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
#声明cni网络插件
--network-plugin=cni \
#cni网络配置目录,kubelet会读取该目录下得网络配置
--cni-conf-dir=/etc/cni/net.d \
#指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP),--cluster-domain 指定域名后缀,这两个参数同时指定后才会生效
--cluster-dns=10.68.0.2 \
...

kubelet.kubeconfig
kubelet依赖的一个配置,格式看也是我们后面经常遇到的yaml格式,描述了kubelet访问apiserver的方式

apiVersion: v1
clusters:

  • cluster:
    #跳过tls,即是kubernetes的认证
    insecure-skip-tls-verify: true
    #api-server地址
    server:http://192.168.1.102:8080
    ...

10-calico.conf
calico作为kubernets的CNI插件的配置

  1. {
  2. "name": "calico-k8s-network",
  3. "cniVersion": "0.1.0",
  4. "type": "calico",
  5. <!--etcdurl-->
  6. "etcd_endpoints": "http://192.168.1.102:2379",
  7. "logevel": "info",
  8. "ipam": {
  9. "type": "calico-ipam"
  10. },
  11. "kubernetes": {
  12. <
  13. !--api-serverurl-->
  14. "k8s_api_root": "http://192.168.1.102:8080"
  15. }
  16. }

8. 小试牛刀

到这里最基础的kubernetes集群就可以工作了。下面我们就来试试看怎么去操作,控制它。 我们从最简单的命令开始,尝试一下kubernetes官方的入门教学:playground的内容。了解如何创建pod,deployments,以及查看他们的信息,深入理解他们的关系。

  1. #常用命令
  2. 237 kubectl version
  3. 238 kubectl get nodes
  4. 239 kubectl get --help
  5. 241 kubectl run kubernetes-bootcamp --image=jocatalin/kubernetes-bootcamp:v1 --port=8080
  6. 242 kubectl get deployments
  7. 243 kubectl get pods
  8. 244 kubectl get pods -o wide
  9. 245 docker ps
  10. 246 kubectl get deployments
  11. 248 kubectl delete deployments kubernetes-bootcamp
  12. 250 kubectl run kubernetes-bootcamp --image=jocatalin/kubernetes-bootcamp:v1 --port=8080
  13. 255 docker ps
  14. 256 journalctl -f
  15. 259 kubectl describe deploy kubernetes-bootcamp
  16. 260 kubectl proxy
  17. 262 kubectl scale deploy kubernetes-bootcamp --replicas=4
  18. 266 kubectl scale deploy kubernetes-bootcamp --replicas=2
  19. 269 kubectl describe deploy
  20. 272 kubectl set image deploy kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
  21. 274 kubectl rollout status deploy kubernetes-bootcamp
  22. 277 kubectl rollout undo deploy kubernetes-bootcamp
  23. nginx-pod.yaml文件
  24. apiVersion: v1
  25. kind: Pod
  26. metadata:
  27. name: nginx
  28. spec:
  29. containers:
  30. - name: nginx
  31. image: nginx:1.7.9
  32. ports:
  33. - containerPort: 80
  34. 284 kubectl create -f ~/services/nginx-pod.yaml
  35. 285 curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/nginx/
  36. nginx-deployment.yaml
  37. apiVersion: apps/v1beta1
  38. kind: Deployment
  39. metadata:
  40. name: nginx-deployment
  41. spec:
  42. replicas: 2
  43. template:
  44. metadata:
  45. labels:
  46. app: nignx
  47. spec:
  48. containers:
  49. - name: nginx
  50. image: nginx:1.7.9
  51. ports:
  52. - containerPort: 80
  53. 323 kubectl create -f ~/services/nginx-deployment.yaml
  54. 324 kubectl get pods -l app=nginx
  55. 235 kubectl get deployment -n kube-system

9. 为集群增加service功能 - kube-proxy(工作节点)

9.1 简介

每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,是让我们的服务在集群外可以被访问到的重要方式。

9.2 部署

通过系统服务方式部署:

  1. #确保工作目录存在
  2. $ mkdir -p /var/lib/kube-proxy
  3. #复制kube-proxy服务配置文件
  4. $ cp target/worker-node/kube-proxy.service /lib/systemd/system/
  5. #复制kube-proxy依赖的配置文件
  6. $ cp target/worker-node/kube-proxy.kubeconfig /etc/kubernetes/
  7. $ systemctl enable kube-proxy.service
  8. $ service kube-proxy start
  9. $ journalctl -f -u kube-proxy

9.3 重点配置说明

kube-proxy.service

[Unit]
Description=Kubernetes Kube-Proxy Server ...
[Service]
#工作目录
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/home/michael/bin/kube-proxy \
#监听地址
--bind-address=192.168.1.103 \
#依赖的配置文件,描述了kube-proxy如何访问api-server
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
...

kube-proxy.kubeconfig配置了kube-proxy如何访问api-server,内容与kubelet雷同,不再赘述。

9.4 操练service

刚才我们在基础集群上演示了pod,deployments。下面就在刚才的基础上增加点service元素。

  1. 423 kubectl expose deploy kubernetes-bootcamp --type="NodePort" --target-port=8080 --port=80
  2. 424 kubectl get services
  3. 425 curl 10.0.94.182:39741
  4. 426 kubectl get pods -o wide
  5. 427 kubectl get services
  6. server01
  7. # docker exec -it cc6aa3fc38a0 bash
  8. 1 curl 10.68.34.35
  9. 2 curl 172.20.60.133
  10. 428 vi ~/services/nginx-service.yaml
  11. apiVersion: v1
  12. kind: Service
  13. metadata:
  14. name: nginx-service
  15. spec:
  16. ports:
  17. - port: 8080
  18. targetPort: 80
  19. nodePort: 20000
  20. selector:
  21. app: nginx
  22. type: NodePort
  23. 429 kubectl create -f ~/services/nginx-service.yaml
  24. 430 kubectl get services
  25. 431 curl 10.0.94.182:20000

10. 为集群增加dns功能 - kube-dns(app)

10.1 简介

kube-dns为Kubernetes集群提供命名服务,主要用来解析集群服务名和Pod的hostname。目的是让pod可以通过名字访问到集群内服务。它通过添加A记录的方式实现名字和service的解析。普通的service会解析到service-ip。headless service会解析到pod列表。

10.2 部署

通过kubernetes应用的方式部署kube-dns.yaml文件基本与官方一致(除了镜像名不同外)。 里面配置了多个组件,之间使用”---“分隔

  1. #到kubernetes-starter目录执行命令
  2. $ kubectl create -f target/services/kube-dns.yaml

10.3 重点配置说明

请直接参考配置文件中的注释。

10.4 通过dns访问服务

这了主要演示增加kube-dns后,通过名字访问服务的原理和具体过程。演示启动dns服务和未启动dns服务的通过名字访问情况差别。

k8s1.9.0安装--基础集群部署的更多相关文章

  1. k8s1.9.0安装--完整集群部署

    三.完整集群部署 - kubernetes-with-ca 1. 理解认证授权 1.1 为什么要认证 想理解认证,我们得从认证解决什么问题.防止什么问题的发生入手.防止什么问题呢?是防止有人入侵你的集 ...

  2. 初识zookeeper以及安装和集群部署

    初识zookeeper以及安装和集群部署     一.Zookeeper单体版安装     在安装zookeeper之前要先安装jdk环境,具体在linux环境安装jdk1.8请参照linux笔记. ...

  3. redis CentOS6.5安装及集群部署

    .下载redis source包 链接:https://pan.baidu.com/s/122ZCjNvjl9Jx6M2YsLrncw 密码:92ze 2.解压 tar -xzf redis-3.2. ...

  4. kafka单机版的安装、集群部署 及使用

    1.安装kafka(单机版) 1.1上传 kafka_2.11-2.0.0.tgz 到 /root/Downloads 1.2解压 tar 包 tar -zxvf kafka_2.11-2.0.0.t ...

  5. centos7.0 安装redis集群

    生产环境下redis基本上都是用的集群,毕竟单机版随时都可能挂掉,风险太大.这里我就来搭建一个基本的redis集群,功能够用但是还需要完善,当然如果有钱可以去阿里云买云数据库Redis版的,那个还是很 ...

  6. RabbitMQ安装以及集群部署

    本次记录安装RabbitMQ的过程,只针对MAC下单机版安装.单机集群安装方法以及配置haproxy负载均衡. RabbitMQ单机版本安装 RabbitMQ单机集群安装方法(适合开发练习) Rabb ...

  7. Redis5.0.8 Cluster集群部署

    目录 一.Redis Cluster简介 二.部署 三.创建主库 一.Redis Cluster简介 Redis Cluster集群是一种去中心化的高可用服务,其内置的sentinel功能可以提供高可 ...

  8. Centos7上安装Kubernetes集群部署docker

    一.安装前准备1.操作系统详情需要三台主机,都最小化安装 centos7.3,并update到最新 [root@master ~]# (Core) 角色 主机名 IPMaster master 192 ...

  9. Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记

    目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...

随机推荐

  1. ASP.NET Web API 直到我膝盖中了一箭【1】基础篇

    蓦然回首,那些年,我竟然一直很二. 小时候,读武侠小说的时候,看到那些猪脚,常常会产生一种代入感,幻想自己也会遭遇某种奇遇,遇到悬崖跳下去是不是有本“武林秘笈”在等着?长大以后也是一样,多少人梦着醒着 ...

  2. 【图文】[新手]C++ 动态库导出函数名“乱码”及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...

  3. Adam和学习率衰减(learning learning decay)

    目录 梯度下降法更新参数 Adam 更新参数 Adam + 学习率衰减 Adam 衰减的学习率 References 本文先介绍一般的梯度下降法是如何更新参数的,然后介绍 Adam 如何更新参数,以及 ...

  4. 【时间工具】整理下java时间换算专题

    首先总结了一下日期转换基础,最常用的两个工具类Date与calender,转换方法如下: package com.zzt.spider; import java.text.SimpleDateForm ...

  5. BFS(三):双向广度优先搜索

    所谓双向广度搜索指的是搜索沿两个方向同时进行:(1)正向搜索:从初始结点向目标结点方向搜索:(2)逆向搜索:从目标结点向初始结点方向搜索:当两个方向的搜索生成同一子结点时终止此搜索过程. 广度双向搜索 ...

  6. HDU 2298:Toxophily(推公式)

    http://acm.hdu.edu.cn/showproblem.php?pid=2298 题意:给出一个x,y,v,问从(0,0)以v为初速度射箭,能否射到(x,y)这个点,如果能,输出最小的射出 ...

  7. 网络虚拟化基础协议·Geneve

    [分层] 要实现网络虚拟化,最基础的技术肯定是分层(OverLay & UnderLay). ·UnderLay 中文释义中,老房子漏雨,在房子里面撑一把大雨伞,这把大雨伞就是UnderLay ...

  8. 测试调试-利用fiddler修改response返回结果

    测试前端过程中,经常需要验证各种功能状态.不同数据层级等返回后的展示效果.一般会通过以下三种方式进行测试: 1.构造满足条件的测试数据:(耗时费力) 2.修改数据库:(前提需要了解数据库数据存储.沟通 ...

  9. 基数排序的可复用实现(C++11/14/17/20)

    基数排序,是对整数类型的一种排序方法,有MSD (most significant digit)和LSD (least significant digit)两种.MSD将每个数按照高位分为若干个桶(按 ...

  10. html解析器:Html Agility Pack

    去掉注释.样式.和js代码: foreach(var script in doc.DocumentNode.Descendants("script").ToArray()) scr ...