一、基础前提环境部署

1.环境准备

centos 7.6

cpu:双核

mem:2G

3个node节点时间必须同步
masternode1node2
192.168.229.187192.168.229.40192.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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐