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模式,采用随机、轮循负载均衡算法,以此来达到负载分担的效果 |
pod | kubernetes集群存储的最小单位 |
service | 虚拟一个IP地址以及端口号,供外部客户端能够访问到集群内部的pod资源 |
Kubernetes集群构建
环境准备
测试环境
节点角色 | IP地址 |
---|---|
master | 192.168.1.100 |
node1 | 192.168.1.200 |
node2 | 192.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>