05.k8s集群部署及功能介绍

不打扰是莪最后的温柔 提交于 2019-12-15 04:07:02

1:k8s集群的安装

1.1 k8s的架构

1.2:修改IP地址、主机和host解析

10.0.0.11  k8s-master
10.0.0.12  k8s-node-1
10.0.0.13  k8s-node-2
所有节点需要做hosts解析

1.3:master节点安装etcd

yum install etcd -y

vim /etc/etcd/etcd.conf

6行:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

21行:ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"

systemctl start etcd.service

systemctl enable etcd.service
etcdctl set testdir/testkey0 0
etcdctl get testdir/testkey0
etcdctl -C http://10.0.0.11:2379 cluster-health

下面是一些常用配置选项的说明:

--name:					方便理解的节点名称,默认为 default,在集群中应该保持唯一
--data-dir:				服务运行数据保存的路径,默认为 ${name}.etcd
--snapshot-count:		指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
--heartbeat-interval:leader 		多久发送一次心跳到 followers。默认值是 100ms
--eletion-timeout:		重新投票的超时时间,如果follower在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
--listen-peer-urls:		和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost
--advertise-client-urls:		对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
--listen-client-urls:			对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和etcd交互
--initial-advertise-peer-urls:		该节点同伴监听地址,这个值会告诉集群中其他节点
--initial-cluster:		集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。需要注意的是,这里的 node1 是节点的--name指定的名字;后面的ip1:2380 是--initial-advertise-peer-urls 指定的值
--initial-cluster-state:		新建集群的时候,这个值为 new;假如已经存在的集群,这个值为existing
--initial-cluster-token:		创建集群的token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误

PS:etcd原生支持做集群,需要的看我etcd集群搭建教程

1.4:master节点安装kubernetes

yum install kubernetes-master.x86_64 -y

vim /etc/kubernetes/apiserver 

8行:  KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

11行:KUBE_API_PORT="--port=8080"

14行: KUBELET_PORT="--kubelet-port=10250"

17行:KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"

23行:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
vim /etc/kubernetes/config

22行:KUBE_MASTER="--master=http://10.0.0.11:8080"

systemctl enable kube-apiserver.servic
systemctl restart kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl restart kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl restart kube-scheduler.service

检查服务是否安装正常
[root@k8s-master ~]# kubectl get componentstatus 
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}  

1.5:node节点安装kubernetes

1.安装
yum install kubernetes-node.x86_64 -y

2.配置:
vim /etc/kubernetes/config 
22行:KUBE_MASTER="--master=http://10.0.0.11:8080"

vim /etc/kubernetes/kubelet
5行:KUBELET_ADDRESS="--address=0.0.0.0"

8行:KUBELET_PORT="--port=10250"

11行:KUBELET_HOSTNAME="--hostname-override=10.0.0.12"

14行:KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"

3.启动
systemctl enable kubelet.service
systemctl restart kubelet.service
systemctl enable kube-proxy.service
systemctl restart kube-proxy.service

4.检查
在master节点检查
[root@k8s-master ~]# kubectl get nodes
NAME        STATUS    AGE
10.0.0.12   Ready     1m
10.0.0.13   Ready     11s

6:所有节点配置flannel网络

flannel是一个超级大的局域网;16位子网掩码

1.安装
yum install flannel -y

sed -i 's#http://127.0.0.1:2379#http://10.0.0.11:2379#g' /etc/sysconfig/flanneld

##master节点:规划网段范围
etcdctl mk /atomic.io/network/config   '{ "Network": "172.18.0.0/16" }'
检查:
[root@k8s-master ~]# etcdctl get /atomic.io/network/config
{ "Network": "172.18.0.0/16" }

yum install docker -y
systemctl enable flanneld.service 
systemctl restart flanneld.service 
systemctl  restart  docker
systemctl  enable  docker
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
===========================================================
===========================================================
##node节点:
systemctl enable flanneld.service 
systemctl restart flanneld.service 
systemctl  restart  docker
systemctl restart kubelet.service
systemctl restart kube-proxy.service

##所有节点都要操作:配置iptables规则,实现宿主机与容器通信
vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
systemctl daemon-reload 
systemctl restart docker


理论知识:创建完flannel网络后,它会自动生成以下文件
[root@k8s-master ~]# cat /usr/lib/systemd/system/docker.service.d/flannel.conf 
[Service]
EnvironmentFile=-/run/flannel/docker
[root@k8s-master ~]# cat /run/flannel/docker 
DOCKER_OPT_BIP="--bip=172.18.42.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS=" --bip=172.18.42.1/24 --ip-masq=true --mtu=1472"

7:配置master为镜像仓库【可选择harbor作为仓库】

#所有节点

vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}

systemctl restart docker

#master节点
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

2:什么是k8s,k8s有什么功能?

是一个开源系统,用于容器化应用的自动部署、扩缩和管理。

Kubernetes 将构成应用的容器按逻辑单位进行分组以便于管理和发现。 Kubernetes 基于 [谷歌公司在运行生产负载上的 15 年经验](http://queue.acm.org/detail.cfm?id=2898444) 打造,并融合了来自社区的最佳建议与实践。

k8s是一个docker集群的管理工具
k8s是容器的编排工具

2.1 k8s的核心功能

1.自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。

2.弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量

3.服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。

4.滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

5.私密配置文件管理. web容器里面,数据库的账户密码(测试库密码)

2.2 k8s的历史【历史不用太追究,就让他过去吧···】

2014年 docker容器编排工具,立项
2015年7月 发布kubernetes 1.0, 加入cncf基金会 孵化
2016年,kubernetes干掉两个对手,docker swarm,mesos marathon 1.2版
2017年 1.5 -1.9
2018年 k8s 从cncf基金会 毕业项目
2019年: 1.13, 1.14 ,1.15,1.16 1.17
cncf :cloud native compute foundation
kubernetes (k8s): 希腊语 舵手,领航者 容器编排领域,
谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes

2.3 k8s的安装方式

yum安装 1.5 最容易安装成功,最适合初学者
源码编译安装---难度最大 可以安装最新版

二进制安装---步骤繁琐 可以安装最新版 shell,ansible,saltstack	生产使用
kubeadm 安装最容易, 网络 可以安装最新版						生产使用

minikube 适合开发人员体验k8s, 网络[单机版服务]

2.4 k8s的应用场景

k8s最适合跑微服务项目!
N多个小服务,每个服务都有自己的数据库,自己的域名,web服务
提供更高的并发,更高的可用性,发布周期更短

3:k8s常用的资源

3.1 创建pod资源

pod是最小资源单位.
任何的一个k8s资源都可以由yml清单文件来定义
k8s yaml的主要组成:
apiVersion: v1  api版本
kind: pod   资源类型
metadata:   属性
spec:       详细信息
      
master节点
1.创建存放pod的目录
mkdir -p k8s_ymal/pod && cd k8s_ymal/
vim k8s_pod.yaml
[root@k8s-master k8s_yaml]# cat k8s_pod.yml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80


vim /etc/kubernetes/apiserver 
=====删除那个serveraccept 然后重启apiserver
systemctl restart kube-apiserver.service 

kubectl create -f k8s_pod.yaml
kubectl get pod
kubectl describe pod nginx
================================================================================
node节点操作:
k8s-node2上传pod-infrastructure-latest.tar.gz和nginx
[root@k8s-node-2 ~]  docker load -i pod-infrastructure-latest.tar.gz 
[root@k8s-node-2 ~]# docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/pod-infrastructure:latest
[root@k8s-node-2 ~]# docker push 10.0.0.11:5000/pod-infrastructure:latest

[root@k8s-node-2 ~]# docker load -i docker_nginx1.13.tar.gz
[root@k8s-node-2 ~]# docker tag docker.io/nginx:1.13 10.0.0.11:5000/nginx:1.13
[root@k8s-node-2 ~]# docker push 10.0.0.11:5000/nginx:1.13
=====================================================================
master节点:
kubectl describe pod nginx		#查看描述状态
kubectl get pod
======================================================================
node1和node2节点都要操作:
vim /etc/kubernetes/kubelet

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.11:5000/pod-infrastructure:latest"

systemctl restart kubelet.service

master节点验证:
[root@k8s-master k8s_yaml]# kubectl get pod -o wide
NAME      READY     STATUS    RESTARTS   AGE       IP            NODE
nginx     1/1       Running   0          3m        172.18.92.2   10.0.0.13

为什么创建一个pod资源,k8s需要启动两个容器
业务容器:nginx ,
基础容器:pod ,定制化功能,
为了实现k8s自带的那些高级功能
===============================================================================================
pod资源:至少由两个容器组成,pod基础容器和业务容器组成(最多1+4)
pod配置文件2[root@k8s-master pod]# vim k8s_pod3.yml
apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
    - name: busybox
      image: 10.0.0.11:5000/busybox:latest
      command: ["sleep","1000"]
      
[root@k8s-master pod]# kubectl create -f k8s_pod3.yml 
pod "test" created
[root@k8s-master pod]# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
nginx     1/1       Running   0          54m
test      2/2       Running   0          30s

===========================================================
模拟某一个node节点故障:
[root@k8s-node-2 ~]# systemctl stop kubelet.service 
[root@k8s-master rc]# kubectl get nodes 
NAME        STATUS     AGE
10.0.0.12   Ready      9h
10.0.0.13   NotReady   9h
这时候master节点检测出node2已经故障,k8s会重试拉起node2,它会把故障的驱逐至另一个节点;
其实是驱逐,但是它起的是新pod,这个就是rc的使命

[root@k8s-master rc]# kubectl delete node 10.0.0.13
node "10.0.0.13" deleted
master删除node2后,它会很快的迁移至另一个节点
[root@k8s-master rc]# kubectl get pod -o wide

启动node3
[root@k8s-node-2 ~]# systemctl start kubelet.service
[root@k8s-master rc]# kubectl get nodes
NAME        STATUS    AGE
10.0.0.12   Ready     9h
10.0.0.13   Ready     49s
接下来创建的Pod它会先选择node2,直到两个节点平等,如果配置不一样的话,它会优先选择配置好的;如果你在node节点清除容器,它会自动重新启动,kubelet它自带保护机制,这也是它的优势所在

3.2 ReplicationController资源

rc功能:保证指定数量的pod始终存活,rc通过标签选择器select来关联pod
k8s资源的常见命令操作:

kubectl create -f xxx.yaml 		创建资源
kubectl get pod|rc|node			查看资源列表
kubectl describe pod nginx   	查看具体资源的详细信息【排错专用】
kubectl delete pod nginx 或者kubectl delete -f xxx.yaml 	删除资源+资源的类型+名字	
kubectl edit pod nginx			修改资源的属性和配置文件
kubectl get pod -o wide --show-labels	查看标签信息
kubectl get rc -o wide	查看rc使用哪个标签
						删除资源还可以直接删除yaml文件即可

3.2.1创建一个rc

vim rc/k8s_rc.yml

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 5  #副本5
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: 10.0.0.11:5000/nginx:1.13
        ports:
        - containerPort: 80

[root@k8s-master rc]# kubectl create -f k8s_rc.yml
[root@k8s-master rc]# kubectl get rc
[root@k8s-master rc]# kubectl get pod
[root@k8s-master rc]# kubectl get pod -o wide --show-labels
[root@k8s-master rc]# kubectl get rc -o wide

kubelet监控本机的docker容器,启动新的容器
k8s集群,pod数量少了,controller-manager启动新的pod 

3.2.2rc的滚动升级 新建一个nginx-rc1.15.yaml

前提是在我们的node节点上传nginx1.15版本--->docker load -i --->docker tag ---->docker push 
[root@k8s-node-2 ~]# docker load -i docker_nginx1.15.tar.gz
[root@k8s-node-2 ~]# docker tag docker.io/nginx:latest 10.0.0.11:5
[root@k8s-node-2 ~]# docker push 10.0.0.11:5000/nginx:1.15
=================================================================
1.编写升级版本yml文件
[root@k8s-master rc]# cat k8s_rc2.yml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx2
spec:
  replicas: 5  #副本5
  selector:
    app: myweb2		#标签选择器
  template:
    metadata:
      labels:
        app: myweb2		#标签
    spec:
      containers:
      - name: myweb
        image: 10.0.0.11:5000/nginx:1.15	#版本
        ports:
        - containerPort: 80

2.升级操作以及验证:
[root@k8s-master rc]# kubectl rolling-update nginx -f k8s_rc2.yml --update-period=5s
[root@k8s-master rc]# kubectl get pod -o wide
[root@k8s-master rc]# curl -I 172.18.92.3
HTTP/1.1 200 OK
Server: nginx/1.15.5
......

3.回滚操作并验证:回滚主要靠的是yaml文件
[root@k8s-master rc]# kubectl rolling-update nginx2 -f k8s_rc.yml --update-period=1s
[root@k8s-master rc]# kubectl get pod -o wide
[root@k8s-master rc]# curl -I 172.18.95.4
HTTP/1.1 200 OK
Server: nginx/1.13.12
.....

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!