CentOS 7 构建Kubernetes集群

kubernetes概述

kubernetes简介

kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制
------来源百度百科

附:kubernetes和OpenStack的区别
kubernetes:k8s是管理container(容器)的云平台
OpenStack:OpenStack是管理KVM(虚拟机)的平台

通常以上两者是可以联合使用的,因为容器可以运行在虚拟机上,我们通过kubernetes来管理容器,在通过OpenStack来管理虚拟机

kubernetes常用组件介绍

K8s集群主要由两个大的部分组成

1. master节点
master节点的主要作用是管理和控制整个集群
2. 多个node节点
node节点的主要作用就是,主要负责维护容器的生命周期,如删除容器、创建、停止docker容器等 最主要就是容器的相关操作

在master节点上创建的资源,都会在node节点上运行,所以node节点就相当于工作节点

master节点常用组件

名称作用
Api Server提供接口服务,整个集群的交互中心,所有组件通过Api Server 组件完成调度
scheduler对集群内部pod资源进行调度和分配操作,如:新建的pod就是通过这个组件分配到各个工作节点上
controller manager控制器管理器,主要负责kubernetes集群的故障检测和自动恢复工作
Etcd键值对数据库,只和Api Server 进行交互,存放了整个集群的所有数据以及创建的资源信息

node节点常用组件

名称作用
container容器。创建、删除、运行等操作
kubelet管理 Pod、Pod 中容器及容器的镜像和卷等信息(kubelet、kub-proxy都运行在工作节点)
kub-proxy端口代理,主要是为了解决容器启动占用同一宿主机端口的问题,相当于lvs-nat模式,采用随机、轮循负载均衡算法,以此来达到负载分担的效果
podkubernetes集群存储的最小单位
service虚拟一个IP地址以及端口号,供外部客户端能够访问到集群内部的pod资源

Kubernetes集群构建

环境准备

测试环境

节点角色IP地址
master192.168.1.100
node1192.168.1.200
node2192.168.1.250

系统版本为:CentOS-7.5-x86_64-DVD-1804.iso
修改主机名称

在对应主机上进行设置
[root@localhost ~]# hostnamectl set-hostname master 
[root@localhost ~]# hostnamectl set-hostname node1 
[root@localhost ~]# hostnamectl set-hostname node2 

关闭防火墙以及selinux

三个节点操作一致(只展示master操作)
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# vi /etc/selinux/config 
SELINUX=disabled
[root@master ~]# setenforce 0
[root@master ~]# iptables -F
[root@master ~]# iptables -X
[root@master ~]# iptables -Z
[root@master ~]# /usr/sbin/iptables-save 

配置ssh无密码登录以及修改hosts文件

[root@master ~]# vi /etc/hosts
192.168.1.100   master
192.168.1.200   node1
192.168.1.250   node2
[root@master ~]# ssh-keygen 
[root@master ~]# ssh-copy-id node1
[root@master ~]# ssh-copy-id node2
[root@master ~]# scp /etc/hosts root@node1:/etc/hosts
[root@master ~]# scp /etc/hosts root@node2:/etc/hosts

关闭swap交换分区、开启内核转发功能

三个节点均要执行这一步 (三台操作一致,展示master操作)
[root@master ~]# swapoff -a    //临时关闭所有交换分区
[root@master ~]# vi /etc/fstab    //永久关闭
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@master ~]# mount -a 
[root@master ~]# modprobe br_netfilter    //加载这个模块
[root@master ~]# vi /etc/sysctl.conf    //修改这个文件添加如下内容
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@master ~]# sysctl -p

配置本地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
[root@master ~]# yum clean all 
[root@master ~]# yum makecache 

搭建过程如下

安装docker

三个节点均要进行安装操作
[root@master ~]# yum install -y docker 
[root@master ~]# vi /etc/docker/daemon.json 
{
 "registry-mirrors": ["https://ocfyrwaf.mirror.aliyuncs.com"]
}
[root@master ~]# systemctl start docker 
[root@master ~]# systemctl enable  docker 

安装kubernetes相关软件包

这一步三个节点都要执行
[root@master ~]# yum list --showduplicates kubectl   查询对应版本
[root@master ~]# yum install -y kubeadm-1.18.2-0 kubectl-1.18.2-0 kubelet-1.18.2-0
[root@master ~]# systemctl start kubelet 
[root@master ~]# systemctl enable  kubelet 

配置kubernetes命令自动补全

只需master节点执行即可
[root@master ~]# yum install -y bash-completion
[root@master ~]# vi /etc/profile    //编辑环境变量配置文件,添加如下信息
source <(kubectl completion bash)
source <(kubeadm completion bash)
[root@master ~]# source /etc/profile

master节点初始化kubernetes集群

注:在初始化之前要确保CPU的核数为2
[root@master ~]# kubeadm init --kubernetes-version=v1.18.2 --apiserver-advertise-address=192.168.1.100 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
--kubernetes-version         指定kubernetes的版本号
--apiserver-advertise-address  指定apiserver服务器的IP地址
--image-repository    指定拉取镜像仓库的IP地址
--pod-network-cidr    指定pod资源网段的IP地址

初始化成功之后会显示如下参数
...............
mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.100:6443 --token k3tdu5.atifk2cta78wje4l \
    --discovery-token-ca-cert-hash sha256:60ae09d082a2c7fb052e5155df186a177bf1cff27682a467875cedfee700015c 

然后我们根据上面的提示执行如下这一些命令即可
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

master节点安装flannel网络组件

[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查询kubernetes集群状态
[root@master ~]# kubectl get nodes 
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   12m   v1.18.2
查看组件运行是否正常
[root@master ~]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-546565776c-dk2qd         1/1     Running   0          12m
coredns-546565776c-l8dpc         1/1     Running   0          12m
etcd-master                      1/1     Running   0          13m
kube-apiserver-master            1/1     Running   0          13m
kube-controller-manager-master   1/1     Running   0          13m
kube-flannel-ds-bjfpc            1/1     Running   0          9m58s
kube-proxy-zgq8j                 1/1     Running   0          12m
kube-scheduler-master            1/1     Running   0          13m

node1和node2加入到kubernetes集群当中

只需要在两个节点执行如下代码即可
kubeadm join 192.168.1.100:6443 --token k3tdu5.atifk2cta78wje4l \
    --discovery-token-ca-cert-hash sha256:60ae09d082a2c7fb052e5155df186a177bf1cff27682a467875cedfee700015c 

执行完成以后在master查看效果
[root@master ~]# kubectl get nodes 
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   18m     v1.18.2
node1    Ready    <none>   2m48s   v1.18.2
node2    Ready    <none>   2m49s   v1.18.2

修改node1和node2的标签为worker (两个修改方法一致,这里只展示node1即可)
[root@master ~]# kubectl edit nodes node1
 23     node-role.kubernetes.io/worker: ""
[root@master ~]# kubectl get nodes 
NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   110m   v1.18.2
node1    Ready    worker   95m    v1.18.2
node2    Ready    worker   95m    v1.18.2

部署nginx

下载nginx镜像

所有节点都要执行
[root@master ~]# docker pull docker.io/nginx 
[root@master ~]# docker images 
REPOSITORY                                                                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx                                                               latest              ae2feff98a0c        10 days ago         133 MB

编写yaml文件来启动nginx

只在master节点执行即可
[root@master ~]# vi nginx-deployment.yaml 
apiVersion: apps/v1           //指定版本号
kind: Deployment             //资源类型为deployment
metadata:                     //设置元数据信息
  name: nginx-deploy          //设置名称
spec:  
  replicas: 1               //设置副本数目
  selector: 
    matchLabels:
      app: nginx-deploy
  template:
    metadata:
      labels:
        app: nginx-deploy 
    spec:
      containers:
      - image: docker.io/nginx:latest    //指定镜像
        name: nginx     //指定启动之后的名称
        ports:
        - containersPort: 80  //指定端口号
[root@master ~]# kubectl apply -f nginx-deployment.yaml   //启动测试 
[root@master ~]# kubectl get pods     //查看运行状态
NAME                          READY   STATUS    RESTARTS   AGE
nginx-deploy-cc4c5f6c-fp8jm   1/1     Running   0          3m36s
[root@master ~]# kubectl get rs     //查看rs
NAME                    DESIRED   CURRENT   READY   AGE
nginx-deploy-cc4c5f6c   1         1         1       3m56s

本地访问测试
[root@master ~]# kubectl get pods -o wide 
NAME                          READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
nginx-deploy-cc4c5f6c-fp8jm   1/1     Running   0          4m48s   10.244.2.2   node2   <none>           <none>
[root@master ~]# curl 10.244.2.2

创建service文件

我们通过yaml文件来进行创建
[root@master ~]# vi service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    app: nginx-deploy
  ports:
  - nodePort: 32200      //指定外部客户端访问的端口号
    port: 80      
    protocol: TCP
    targetPort: 80  
  type: NodePort       
启动测试
[root@master ~]# kubectl apply -f service.yaml 
[root@master ~]# kubectl get svc 
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        141m
nginx        NodePort    10.99.151.39   <none>        80:32200/TCP   113s

浏览器访问测试
在这里插入图片描述
这里我们还可以输入node1 以及node2 的IP地址也能够访问得到,因为在创建pod资源的时候就自动分配到node1或者node2 节点上了

[root@master ~]# kubectl get pods -o wide 
NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
nginx-deploy-7756d7bd6b-8wdn9   1/1     Running   0          15m   10.244.2.4   node2   <none>           <none>

任务是在节点二上进行创建的

deployment扩容操作:
[root@master ~]# kubectl scale deployment nginx-deploy --replicas=2
[root@master ~]# kubectl get pods -o wide 
NAME                            READY   STATUS    RESTARTS   AGE    IP           NODE    NOMINATED NODE   READINESS GATES
nginx-deploy-7756d7bd6b-8wdn9   1/1     Running   0          26m    10.244.2.4   node2   <none>           <none>
nginx-deploy-7756d7bd6b-hlsdw   1/1     Running   0          2m9s   10.244.3.2   node1   <none>           <none>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ball-4444

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值