k8s|k8s部署及其相关介绍


k8s集群部署

  • 一、基础前提环境部署
    • 二、部署k8s集群
      • 三、k8s架构及基本概念
        • 四、创建资源的两种方式

一、基础前提环境部署 1.环境准备
centos 7.6cpu:双核mem:2G3个node节点时间必须同步

master node1 node2
192.168.229.187 192.168.229.40 192.168.229.50
安装的k8s版本为1.15.0版本,docker部署安装指定版本18.9.0。
2.设置主机名
[root@localhost ~]# hostnamectl set-hostname master#master节点操作 [root@localhost ~]# hostnamectl set-hostname node1#node1节点操作 [root@localhost ~]# hostnamectl set-hostname node2#node2节点操作

3.关闭防火墙
[root@master ~]# systemctl stop firewalld [root@master ~]# systemctl disable firewalld

4.禁用selinux
[root@master ~]# vim /etc/selinux/config SELINUX=disabled

5.禁用swap
[root@master ~]# swapoff –a [root@master ~]# vim /etc/fstab #/dev/mapper/centos-swap swapswapdefaults0 0 [root@master ~]# free -h

6.编辑对应的域名解析
[root@master ~]# vim /etc/hosts 192.168.229.187 master 192.168.229.40 node1 192.168.229.50 node2

7.设置免密传输
[root@master ~]# ssh-keygen -t rsa [root@master ~]# ssh-copy-id root@node1 [root@master ~]# ssh-copy-id root@node2

8.打开iptables桥接功能
[root@master ~]# vim /etc/sysctl.conf ... net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 [root@master ~]# sysctl -p net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1

如果上述命令执行后没有提示文件夹或目录,输入下面命令。
[root@master ~]# modprobe br_netfilter [root@master ~]# sysctl -p#两个node节点也需要做 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1

基本环境准备完毕,需要在各节点上准备docker以及kubernetes的yum源,推荐使用阿里云的yum源,先在master节点上操作。
二、部署k8s集群 1.添加docker的yum源
(1)安装必要的一些系统工具 yum -y install yum-utils device-mapper-persistent-data lvm2(2)添加软件源信息 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(3)更新并安装Docker-CE yum makecache fast yum -y install docker-ce-18.09.0 docker-ce-cli-18.09.0(4)开启Docker服务 sudo systemctl start docker sudo systemctl enable docker

2.添加kubernetes的yum源
cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF

3.将yum源文件传到其他两个节点
[root@master yum.repos.d]# scp docker-ce.repo kubernetes.repo node1:/etc/yum.repos.d/ [root@master yum.repos.d]# scp docker-ce.repo kubernetes.repo node2:/etc/yum.repos.d/

4.配置docker加速器
[root@master ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://1dmptu91.mirror.aliyuncs.com"]} [root@master ~]# systemctl daemon-reload [root@master ~]# systemctl restart docker

docker版本为:18.09.0,是k8s:1.15.0建议使用的最高版本。
5.安装k8s组件
master节点部署kubectl、kubelet、kubeadm三个组件,其他节点只部署kubelet、kubeadm。
[root@master ~]# yum -y install kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0 [root@node1 ~]# yum -y install kubelet-1.15.0 kubeadm-1.15.0 [root@node2 ~]# yum -y install kubelet-1.15.0 kubeadm-1.15.0 [root@master ~]# systemctl enable kubelet

现在可以开始初始化了,但是由于国内网络环境限制,不能直接从谷歌的镜像站下载镜像,需要手工从docker镜像站下载镜像,然后重新命名。注意如果想自己下载镜像,下面这些命令下载镜像的版本,不适用于k8s1.15.0版本。
6.镜像的导入
镜像已经提前下载好,只需导入即可。
[root@master ~]# vim images.sh #!/bin/bash for i in /root/images/* do docker load < $i done echo -e "\e[1; 31m导入完成\e[0m"

或者
[root@master ~]# for i in /root/*; do docker load < $i; done

node1和node2只需导入下面3个镜像。
[root@node1 images]# ls kube-proxy-1-15.tar flannel-0.11.0.tar pause-3-1.tar

7.初始化集群
[root@master ~]# kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

根据提示执行下面的命令
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

8.查看节点状态
[root@master ~]# kubectl get node

看到master的状态是NotReady,原因是还缺少一个附件flannel,没有网络各Pod是无法通信的。
9.添加flannel组件
添加网络组件(flannel),flannel可以通过https://github.com/coreos/flannel中获取。
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml [root@master ~]# kubectl get pod -n kube-system

或者提前下载
[root@master ~]# kubectl apply -f kube-flannel.yml [root@master ~]# kubectl get nodes

9.其他节点的组件安装和加入集群
注意:提前准备好相关的镜像。
[root@node1 images]# ls kube-proxy-1-15.tar flannel-0.11.0.tar pause-3-1.tar [root@node1 ~]# kubeadm join 192.168.229.187:6443 --token 3s1qqv.2yjc3r09ghz9xkge \ --discovery-token-ca-cert-hash sha256:d54805f71e054da4a2a0830e02884bf4b4e0b6a744e516a28e2b0c6ba3035c69 [root@node2 ~]# kubeadm join 192.168.229.187:6443 --token 3s1qqv.2yjc3r09ghz9xkge \ --discovery-token-ca-cert-hash sha256:d54805f71e054da4a2a0830e02884bf4b4e0b6a744e516a28e2b0c6ba3035c69 [root@master ~]# kubectl get nodes

确保所有pod都是running状态。
[root@master ~]# kubectl get pod --all-namespaces

10.设置kubectl命令行工具自动补全功能
[root@master ~]# yum -y install bash-completion [root@master ~]# source /usr/share/bash-completion/bash_completion [root@master ~]# source <(kubectl completion bash) [root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

11.设置tab键空格个数为2
为了后续写yaml文件的方便。
[root@master ~]# vim .vimrc set tabstop=2 [root@master ~]# source .vimrc

12.集群调试常用命令
如何安装指定版本kubernetes,注意kubernetes的版本一致,主要体现在下载的各个组件的统一。
如果集群初始化过程中出现问题,即使问题解决了,再次初始化集群之前,应该运行下边的命令。
[root@master ~]# kubeadm reset Kube-proxy,kube-apiserver,kube-controller-manager,kube-scheduler

列出已经安装过的rpm包
yum list installed | grep kube

卸载安装的rpm包
yum remove kubeadm.x86_64 kubectl.x86_64 kubelet.x86_64 -y

安装指定的kubeadm
yum -y install kubelet-1.12.1 kubeadm-1.12.1 kubectl-1.12.1

三、k8s架构及基本概念
k8s|k8s部署及其相关介绍
文章图片

1.k8s模块介绍
kubectl:k8s的命令行端,用来发送客户的操作指令。API server:k8s集群的前端接口。 各种客户端工具以及k8s的其它组件可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API,即K8S API。Scheduler:负责将Pod放在哪个node上运行。 在调度时,会充分考虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、数据亲和性和需求。Controller Manager:负责管理集群的各种资源,保证资源处于预期的状态。 由多种Controller组成,包括Replication Controller、Endpoints Controller、Namespace Controller、Serviceaccounts Controller等。Etcd:负责保存k8s集群的配置信息和各种资源的状态信息。 当数据发生变化时,etcd会快速通知k8s的相关组件。 第三方组件,它有可替换方案:Consul、zookeeper。Pod:k8s集群的最小组成单位。 一个Pod内,可以运行一个或多个容器。大多数情况下,一个Pod内只有一个Container。Flannel:k8s集群网路方案。 可以保证Pod的跨主机通信。 第三方解决方案,也有替换方案。Kubelet:Node的agent。 当Scheduler确定某个Node上运行Pod后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向Master报告运行状态。kube-proxy:负责将访问service的TCP/UDP数据流转发到后端的容器。 如果有多个副本,kube-proxy会实现负载均衡。

2.示例
创建一个deployment资源对象,Pod控制器。
[root@master ~]# kubectl run test-web --image=httpd --replicas=2 --port=80 [root@master ~]# kubectl get pod -o wide NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATES test-web-667c58c6d8-7s7vb1/1Running02m46s10.244.1.2node1 test-web-667c58c6d8-7xl961/1Running02m46s10.244.2.2node2

各个组件的作用及架构工作流程:
(1)kubectl发送部署请求到API server; (2)API server通知Controller Manager创建一个Deployment资源; (3)Scheduler执行调度任务,将两个副本Pod分发到node1和node2上; (4)node1和node2上的kubelet创建并运行Pod;

补充:
(1)应用的配置信息和当前pod的状态信息保存在etcd中。 执行kubectl get pod时,API server会从etcd中读取这些数据; (2)flannel会为每个Pod分配一个IP,但此时没有创建Service资源,目前kube-proxy还没有参与进来;

3.常见资源对象类型
Replication Controller:用于确保每个Pod副本在任意时刻都能满足目标数量。 它用于保证每个容器或容器组总是运行并且可以访问:老一代无状态的Pod应用控制器。ReplicaSet:新一代无状态的Pod应用控制器。 它与RC的不同之处在于支持的标签选择器不同,RC只支持等值选择器,RS还额外支持基于集合的选择器。StatefulSet:管理有状态的持久化应用。 如database服务程序,它与Deployment不同之处在于,它会为每一个Pod创建一个独有的持久性标识符,并确保每个Pod之间的顺序性。DaemonSet:确保每个节点都运行了某个Pod的一个副本,新增的节点一样会被添加此类Pod,在节点移除时,此类Pod会被回收。Job:管理运行完成后即可终止的应用,例如批量处理作业任务。Volume:PV PVC storageclassConfigMap:Secret:Role:ClusterRole:RoleBinding:ClusterRoleBinding:Service account:Helm:

四、创建资源的两种方式 1.命令行方式创建
创建Pod控制器,deployment。
到k8s:1.18版本,此方式已变为创建Pod资源。
[root@master ~]# kubectl run web --image=nginx --replicas=2 kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/web created

2.查看控制器情况
[root@master ~]# kubectl get deployments NAMEREADYUP-TO-DATEAVAILABLEAGE web2/222112s [root@master ~]# kubectl get pod NAMEREADYSTATUSRESTARTSAGE web-59765d756f-7s7vb1/1Running0115s web-59765d756f-7xl961/1Running0115s

3.查看资源详细信息
[root@master ~]# kubectl describe deployments. web

注意:查看某种资源对象,如果没有指定名称空间,默认是在default名称空间。可以加上-n选项,查看指定名称空间的资源。
[root@master ~]# kubectl get namespaces NAMESTATUSAGE defaultActive84d kube-node-leaseActive84d kube-publicActive84d kube-systemActive84d

注意:直接运行创建的Deployment资源对象,是经常使用的一个控制器资源类型,除了deployment,还有rc、rs等Pod控制器,Deployment是一个高级的Pod控制器。
4.创建Service资源类型
[root@docker ~]# kubectl expose deployment web --name svc --port=80 --type=NodePort service/svc exposed [root@master ~]# kubectl get svc NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE kubernetesClusterIP10.96.0.1443/TCP84d svcNodePort10.106.19.19380:30843/TCP22s

注意:如果想要外网能够访问服务,可以暴露deployment资源,得到service资源,但svc资源的类型必须为NodePort(大小写必须严格按照要求)。
5.服务的扩容与缩容
[root@docker ~]# kubectl scale deployment web --replicas=8 deployment.extensions/web scaled [root@master ~]# kubectl get deployments. NAMEREADYUP-TO-DATEAVAILABLEAGE web8/88828m [root@docker ~]# kubectl edit deployments. web deployment.extensions/web edited [root@master ~]# kubectl get deployments. NAMEREADYUP-TO-DATEAVAILABLEAGE web2/22231m

6.服务升级与回滚
[root@docker ~]# kubectl set image deployment web web=nginx:1.15 deployment.extensions/web image updated [root@docker ~]# kubectl edit deployments. web deployment.extensions/web edited

7.服务回滚
[root@docker ~]# kubectl rollout undo deployment web

8.常用命令集合
kubectl run#创建一个deployment或job来管理创建的容器; kubectl get#显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源; kubectl expose#将一个资源暴露为一个新的service资源,资源包括pod(po),service(svc),replication controller(rc),deployment(deploy),replicaset(rs); kubectl describe#显示特定资源或资源组的详细信息; kubectl scale#可以对Deployment,ReplicaSet,Replication Controller,或者StatefulSet设置新的值,可以指定一个或多个先决条件; kubectl set#更改现有的应用程序资源; kubectl rollout#资源回滚管理;

9.配置清单
常见Yaml文件写法以及字段的作用。
apiVersion:api版本信息;kind:资源对象的类别;metadata:元数据名称字段必写;spec:用户期望的状态;status:资源现在处于什么样的状态;

可以使用kubectl explain命令查看资源对象的yaml文件怎么写。
比如查看deployment资源:
[root@docker ~]# kubectl explain deploy

10.创建deployment和service资源对象
(1)deployment
[root@master ~]# vim web.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: web1 spec: replicas: 4 template: metadata: labels: app: web1 spec: containers: - name: web1 image: nginx

(2)service
[root@master ~]# vim web-svc.yaml kind: Service apiVersion: v1 metadata: name: svc1 spec: selector: app: web1 ports: - protocol: TCP port: 80 targetPort: 80

使用相同的标签和标签选择器内容,使两个资源对象相互关联。
注意:创建的Service资源,默认type为ClusterIP,意味着集群内任意节点都可访问。它的作用是为后端真正提供服务的Pod提供一个统一的访问接口。如果想要外网能够访问服务,应该把type改为NodePort。
[root@master ~]# vim web-svc.yaml kind: Service apiVersion: v1 metadata: name: svc1 spec: type: NodePort#指定类型,让外网访问 selector: app: web1 ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30033#指定集群映射端口,范围是30000-32767。

【k8s|k8s部署及其相关介绍】11.运行yaml文件
使用kubectl apply -f命令运行yaml文件。
[root@master ~]# kubectl apply -f web.yaml deployment.extensions/web1 created [root@master ~]# kubectl apply -f web-svc.yaml service/svc1 created

    推荐阅读