k8s部署及其相关介绍
k8s一、kubeadm部署k8s集群一、kubeadm部署k8s集群1.环境准备centos 7.6cpu:双核mem:2G3个node节点时间必须同步masternode1node2192.168.229.187192.168.229.40192.168.229.50这里安装的k8s版本为1.15.0版本,docker部署安装指定版本18.9.0设置主机名[root@localhost ~]#
一、基础前提环境部署
1.环境准备
centos 7.6
cpu:双核
mem:2G
3个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 swap swap defaults 0 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 <<EOF > /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架构及基本概念
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
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-web-667c58c6d8-7s7vb 1/1 Running 0 2m46s 10.244.1.2 node1 <none> <none>
test-web-667c58c6d8-7xl96 1/1 Running 0 2m46s 10.244.2.2 node2 <none> <none>
各个组件的作用及架构工作流程:
(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 storageclass
ConfigMap:
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
NAME READY UP-TO-DATE AVAILABLE AGE
web 2/2 2 2 112s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-59765d756f-7s7vb 1/1 Running 0 115s
web-59765d756f-7xl96 1/1 Running 0 115s
3.查看资源详细信息
[root@master ~]# kubectl describe deployments. web
注意:查看某种资源对象,如果没有指定名称空间,默认是在default名称空间。可以加上-n选项,查看指定名称空间的资源。
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 84d
kube-node-lease Active 84d
kube-public Active 84d
kube-system Active 84d
注意:直接运行创建的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
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 84d
svc NodePort 10.106.19.193 <none> 80:30843/TCP 22s
注意:如果想要外网能够访问服务,可以暴露deployment资源,得到service资源,但svc资源的类型必须为NodePort(大小写必须严格按照要求)。
5.服务的扩容与缩容
[root@docker ~]# kubectl scale deployment web --replicas=8
deployment.extensions/web scaled
[root@master ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
web 8/8 8 8 28m
[root@docker ~]# kubectl edit deployments. web
deployment.extensions/web edited
[root@master ~]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
web 2/2 2 2 31m
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。
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
更多推荐
所有评论(0)