kubernates入门
Posted 丶落幕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubernates入门相关的知识,希望对你有一定的参考价值。
kubernates入门
前言
kubernates:
开源容器应用自动化部署技术
master:
k8s集群控制节点,对集群进行任务调度,接受集群外用户去集群操作请求
master node由 API Server,Schedule,ClusterState Store(ETCD数据库)和Controller ManagerServer所组成
nodes:
集群工作节点.运行用户业务应用容器
nodes节点也叫worker node,包含kubelet,kube proxy,和pod(Container Runtime)
kubeadm:
kubeadm是一个k8s部署工具
提供两个操作命令,可以快速部署一个kubernates集群
kubeadm init(创建一个master节点)
kubeadm join(将node节点加入到master集群中)
kubernates部署环境要求
- 两台以上 centos 7
- 内存 2G 以上,CPU 2核 以上
- 集群内各个机器之间能相互通信
- 集群内各个机器可以访问外网,需要拉取镜像
- 禁止swap分区
文章基于kubernates1.19.4
1.环境配置
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
setenforce 0 #临时
关闭swap(k8s禁止虚拟内存以提高性能):
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
swapoff -a #临时
修改hosts:
cat >> /etc/hosts << EOF
192.168.59.140 k8s-master
192.168.59.141 k8s-node1
192.168.59.142 k8s-node2
EOF
设置网桥参数:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#生效
sysctl --system
时间同步:
yum install ntpdate -y
ntpdate time.windows.com
修改hostname,master和node分开设置:
#master修改hostname
hostnamectl set-hostname k8s-master
#node1修改hostname
hostnamectl set-hostname k8s-node1
#node2修改hostname
hostnamectl set-hostname k8s-node2
#查看当前hostname
hostname
2.安装docker
3.kubernates环境搭建
master节点操作(示例):
#添加k8s的阿里云yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#安装 kubeadm,kubelet 和 kubectl
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
#设置开机启动
systemctl enable kubelet.service
#查看版本
kubelet --version
#执行初始化命令(在master节点上执行,ip和version为当前的)
kubeadm init --apiserver-advertise-address=192.168.59.140 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
#执行提示命令进行配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
接下来把node节点加入Kubernetes master中(在Node机器上执行):
#接下来把node节点加入Kubernetes master中(在Node机器上执行)
kubeadm join 192.168.59.139:6443 --token glic6i.vyu76ox0yndqfjvw \\
--discovery-token-ca-cert-hash sha256:789ce71057e03ffa7499b5f91b8d7b88e2d4ba45a8975ab2baf9ee5ce9a2e198
#返回master查看节点
kubectl get nodes
Kubelet:
运行在cluster所有节点上,负责启动POD和容器Kubeadm:
用于初始化cluster的一个工具Kubectl:
kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用
4.部署网络插件
在master机器上运行:
#下载kube-flannel.yml文件(下不了去B站动力节点第一条评论拿资料)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#应用kube-flannel.yml文件
kubectl apply -f kube-flannel.yml
#查看运行时容器pod
kubectl get pods -n kube-system
#查看节点状态
kubectl get nodes
等待节点就绪:
k8s环境搭建完毕
5.Kubernetes部署“容器化应用”
代码如下(示例):
#创建(创建容器并启动)
kubectl create deployment nginx --image=nginx
#通过命令查看pod内的容器
kubectl get pods
#暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
#查看service
kubectl get service
容器是通过scheduler分发给node运行的
层级关系: master --> node --> service --> deployment --> pods --> images
6.小试牛刀
代码如下(示例):
创建一个web项目,随便写个controller
编写Dockerfile
在node节点build镜像(因为镜像实际上是在node节点运行的,下面要指定拉取本地镜像,如果node没有,容器无法启动)
#--dry-run代表-->空运行测试
#-o yaml代表-->输出一个yaml资源清单
# > deploy.yaml-->代表生成deploy.yaml文件并写入
kubectl create deployment k8s-test --image=k8s-test --dry-run -o yaml > deploy.yaml
#修改deploy.yaml(imagePullPolicy: Never:从本地镜像拉取)
containers:
- image: k8s-test
name: k8s-test
imagePullPolicy: Never
#暴露端口并启动服务
kubectl expose deployment NAME --port=8090 --type=NodePort
启动服务前,先要确认容器的状态
可以通过命令: kubectl describe pods k8s-test-74f45f97fb-sw6k4 查看容器详细内容
7.部署Kubernetes Dashbaord
以下都是在master操作(示例):
#下载资源清单(下载不了去B站动力节点评论拿资料)
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
修改文件
#使用资源清单构建dashboard
kubectl apply -f kubernetes-dashboard.yaml
#查看容器状态(等待容器下载完成)
kubectl get pods -n kubernetes-dashboard
可以看到需要一个token
#创建账号
kubectl create serviceaccount dashboard-admin -n kube-system
#赋予权限
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
#生成token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/print $1')
得到token(如果提示无效,再次执行最后一条命令,重新获取token)
8.引入Ingress(暴露应用)
代码如下(示例):
nodePort
外部机器(在windows浏览器)可以访问的端口;
targetPort
容器的端口,与制作容器时暴露的端口一致(Dockerfile中EXPOSE)
port
Kubernetes集群中的各个服务之间访问的端口
NodePort:
NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点(虚拟机)上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里
这种方式有一个“nodePort"的端口,能在节点上指定开放哪个端口,如果没有指定端口,它会选择一个随机端口,大多数时候应该让Kubernetes随机选择端口;
这种方式的不足:
- 一个端口只能供一个服务使用;
- 只能使用30000–32767之间的端口;
- 如果节点/虚拟机的IP地址发生变化,需要人工进行处理;
- 因此,在生产环境不推荐使用这种方式来直接发布服务,如果不要求运行的服务实时可用,或者用于演示或者临时运行一个应用可以用这种方式;
Ingress(重点):
Ingresss是k8s集群中的一个API资源对象,相当于一个集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),比较灵活,生产环境建议使用这种方式;
Ingress不是kubernetes内置的
(安装好k8s之后,并没有安装ingress),ingress需要单独安装,而且有多种类型Google Cloud Load Balancer,Nginx,Contour,Istio等等,我们这里选择官方维护的Ingress Nginx;
9.部署Ingress Nginx:
下载Ingress Nginx:
1、部署一个容器化应用(pod),比如Nginx、SpringBoot程序;
kubectl create deployment nginx --image=nginx
2、暴露该服务;
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
#下载文件(下不了,可以去github上拿或者B站动力节点)
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml
修改成阿里云镜像
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
#使用资源清单
kubectl apply -f ingress-deploy.yaml
确认状态READY
创建Ingress规则:
编写文件: ingress-nginx-rule.yaml
#构架ingress规则
kubectl apply -f ingress-nginx-rule.yaml
#查看ingress规则
kubectl get ing
修改Windows-hosts文件
访问www.abc.com
直接通过IP访问是不行的,只有通过域名访问才会映射,这里直接通过IP访问是Nginx的404,欢迎页不见了
kubectl logs -f PODSNAME 查看日志
10.基于K8S构建Jenkins持续集成平台
安装和配置NFS(示例):
NFS简介
NFS(Network File System),它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以
共享彼此的文件。我们可以利用NFS共享Jenkins运行的配置文件、Maven的仓库依赖文件等
#安装nfs
yum install -y nfs-utils
#开启启动
systemctl enable nfs
#启动服务
systemctl start nfs
#创建共享目录
mkdir -p /opt/nfs/jenkins
#创建配置文件
vi /etc/exports
#新增内容
/opt/nfs/jenkins *(rw,no_root_squash)
#重启服务使配置生效
systemctl restart nfs
在node节点操作(示例):
#安装nfs
yum install -y nfs-utils
#查看共享目录
showmount -e 192.168.59.140
在master节点操作(示例):
资源清单是在B站黑马Jenkins视频评论区捞出来的
#创建命名空间
kubectl create namespace kube-ops
#查看命名空间
kubectl get namespace
浏览器访问,可以看到已经成功了
#进入查件下载地址配置目录
cd /opt/nfs/jenkins/kube-ops-jenkins-home-jenkins-0-pvc-703c7f8d-8c8c-40b9-a3df-a99b480bece0/updates
#修改查件下载源
sed -i 's#http:\\/\\/updates.jekins-ci.org\\/download#https:\\/\\/mirrors.tuna.tsinghua.edu.cn\\/jenkins#g' default.json && sed -i '#/http:\\/\\/www.google.com#https:\\/\\/www.baidu.com#g' default.json
#会到页面切换到Advanced选项修改Update Site
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
#通过浏览器地址栏重启Jenkins
http://192.168.59.141:32355/restart
环境配置结束
总结
文章主要内容来自 B站动力节点k8s视频 and B站黑马Jenkins视频
以上是关于kubernates入门的主要内容,如果未能解决你的问题,请参考以下文章
kubernate 分布式练习-redis-master创建