Kubernetes学习前部署

简介: Kubernetes学习前部署

个人主页

屏幕截图 2023-08-28 163846.png

开源容器应用自动化部署技术Kubernetes

Kubernetes这个单词来自于希腊语,含义是 舵手 或 领航员;

生产环境级别的容器编排

编排是什么意思

   1. 按照一定的目的依次排列;

   2. 调配、安排;

Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理;

Kubernetes拥有Google在生产环境上borg 15年运行的经验,并结合了社区中最佳实践;

K8S是 CNCF 的项目,本来Kubernetes是Google的内部项目,后来开源出来,又后来为了其茁壮成长,捐给了CNCF;

CNCF全称Cloud Native Computing Foundation(云原生计算基金会)

官网:https://kubernetes.io/

中文社区:https://www.kubernetes.org.cn/k8s

代码:https://github.com/kubernetes/kubernetes

Kubernetes是采用Go语言开发的,Go语言是谷歌2009发布的一款开源编程语言;

Kubernetes整体架构

master--nodes

Master:

k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;

Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成;

Nodes:

集群工作节点,运行用户业务应用容器;

Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime);

============================

部署 Kubernetes 环境(集群)

主要有多种方式:

(1)minikube

minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;

https://kubernetes.io/docs/tutorials/hello-minikube/

(2)kind

Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;

https://kind.sigs.k8s.io/

(3)kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

官方地址:

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

(4)二进制包

从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;

(5)yum安装

通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;

(6)第三方工具

有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;

(7)花钱购买

直接购买类似阿里云这样的公有云平台k8s,一键搞定;

============================

Kubeadm部署k8s集群

默认各节点都已经正确安装`docker-ce:19.03.10`,并且都已经正常配置docker加速器。

## 基本环境准备

| Linux版本 | CPU  | MEM     |

| --------- | ---- | ------- |

| CentOS7.8 | 双核 | 4G/node |

| master       | node01       | node02       |

| ------------ | ------------ | ------------ |

| 192.168.8.10 | 192.168.8.20 | 192.168.8.30 |

### 更改主机名
hostnamectl set-hostname master
hostnamectl set-hostname node01
hostnamectl set-hostname node02
### 添加对应域名解析
cat >> /etc/hosts << EOF
192.168.8.10 master
192.168.8.20 node01
192.168.8.30 node02
EOF
### 防火墙,SElinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
### 时间同步
timedatectl set-timezone Asia/Shanghai;timedatectl set-local-rtc 0
### 禁用swap
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab      
free -h 查看禁用效果
### 配置集群无密登录 master到node01,node02无密码
ssh-keygen -t rsa
ssh-copy-id root@node01
ssh-copy-id root@node02
### 优化内核参数
modprobe br_netfilter
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
fs.file-max = 52706963
fs.nr_open = 52706963
net.ipv6.conf.all.disable_ipv6 = 1
net.netfilter.nf_conntrack_max = 2310720
EOF
sysctl -p /etc/sysctl.d/kubernetes.conf
scp /etc/sysctl.d/kubernetes.conf node01:/etc/sysctl.d/
scp /etc/sysctl.d/kubernetes.conf node02:/etc/sysctl.d/
sysctl -p /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf

**到此基本环境准备完毕**,需要在各节点上准备`kubernetes`的`yum`源,这里推荐使用阿里云的`yum`源先来`master`节点上操作

#Kubernetes的阿里源添加
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
#Kubernetes的清华源添加
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=kubernetes
baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=0
EOF

部署k8s组件

#这里注意,master节点部署了kubectl、kubelet、kubeadm三个组件,当然在部署前要指定和k8s版本一致的组件版本。
yum install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 -y --nogpgcheck
systemctl start kubelet
systemctl enable kubelet
#阿里源安装时,需要添加--nogpgcheck参数
#node节点只需部署kubelet-1.18.0 kubeadm-1.18.0即可
# 更改docker默认Cgroup驱动
在/etc/docker/daemon.json文件中,添加一句话即可,当然这个和我们的设置加速器写在一起了。
cat >> /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://1dmptu91.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
#不要忘了重新加载以及重启doker

kubeadm初始化

至此,准备工作做完,可以开始初始化,可是由于国内网络环境限制,我们不能直接从谷歌的镜像站下载镜像,有两种方法可以解决,第一种:需要我们手动从docker镜像站下载镜像,然后重新命名,也可以用脚本来实现。这里我们采用第二种:在初始化k8s的时候,指定镜像源为阿里云。

初始化时指定镜像仓库为阿里云

kubeadm init --kubernetes-version=v1.18.0 --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.8.10 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

或者还有其他方案将k8s集群状态配置问一个yaml文件,然后从yaml文件初始化

kubeadm config print init-defaults > kubeadm-config.yaml
vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.8.10
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
#初始化集群
kubeadm init --config=kubeadm-config.yaml
#成功后提示:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm join 192.168.8.10:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:a2ec410cea22ef589a7af6072008fbace244a9106bde030e771e9d933124ceec 
# PS: 结果做一个保存
systemctl restart kubelet 
kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
master   NotReady   master   5m3s   v1.18.0

**可以看出master的状态是未就绪(NotReady**),之所以是这种状态是因为还缺少一个附件**flannel**,没有网络各Pod是无法通信的

//添加网络组件(flannel),组件flannel可以通过https://github.com/coreos/flannel中获取

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

//再次查看集群节点状态

kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   13m   v1.15.0

以上是主节点的安装部署,然后个node节点的安装,和加入集群,这里注意,验证,node节点已经准备好了相关的镜像。

kubeadm join 192.168.8.10:6443 --token njus35.kw3hxkys3urmnuob --discovery-token-ca-cert-hash sha256:05761b73b571c18eebd6972fb70323cd3c4d8e0aa7514efa2680411310424184

node节点需要几个镜像,可以手动先下载一下,或者从master节点同步

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0
docker pull quay.io/coreos/flannel:v0.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2

等待一会去master节点验证。等待的是同步flannel网络。

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   18m   v1.15.0
node01   Ready    <none>   68s   v1.15.0
node02   Ready    <none>   12s   v1.15.0
> PS: 确保所有pod都是running状态。
//设置kubectl命令行工具自动补全功能
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
#为了以后我们写yaml文件方便些,这里设置tab键空格个数
vim .vimrc
set tabstop=2
#########
source .vimrc
#在master验证k8s组件 如下所示代表安装组件完整且是running状态
kubectl get pod -n kube-system -o wide
NAME                             READY   STATUS    RESTARTS   AGE
coredns-7ff77c879f-qwb6g         1/1     Running   0          60m
coredns-7ff77c879f-zhsgv         1/1     Running   0          60m
etcd-master                      1/1     Running   0          60m
kube-apiserver-master            1/1     Running   0          60m
kube-controller-manager-master   1/1     Running   0          60m
kube-flannel-ds-s6cfd            1/1     Running   0          9m16s
kube-flannel-ds-v75p7            1/1     Running   0          32m
kube-flannel-ds-xhn7c            1/1     Running   0          11m
kube-proxy-6ptb9                 1/1     Running   0          60m
kube-proxy-82lc6                 1/1     Running   0          9m16s
kube-proxy-h5g68                 1/1     Running   0          11m
kube-scheduler-master            1/1     Running   0          60m
#记得三台节点最后要执行systemctl enable kubelet 忘记的集群就启动不了

==============================

Kubernetes部署“容器化应用”

在Kubernetes集群中部署一个Nginx :

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

访问地址:http://NodeIP:Port

在Kubernetes集群中部署一个Tomcat :

kubectl create deployment tomcat --image=tomcat 
kubectl expose deployment tomcat --port=8080 --type=NodePort

访问地址:http://NodeIP:Port

K8s部署微服务(springboot程序):

1、项目打包(jar、war)-->可以采用一些工具git、maven、jenkins

2、制作Dockerfile文件,生成镜像;

3、kubectl create deployment nginx --image= 你的镜像

4、你的springboot就部署好了,是以docker容器的方式运行在pod里面的;

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
存储 Kubernetes 持续交付
k8s学习
【10月更文挑战第1天】
116 4
|
3月前
|
Kubernetes 持续交付 Docker
利用 Docker 和 Kubernetes 实现微服务部署
【10月更文挑战第2天】利用 Docker 和 Kubernetes 实现微服务部署
|
14天前
|
存储 Kubernetes 容器
K8S部署nexus
该配置文件定义了Nexus 3的Kubernetes部署,包括PersistentVolumeClaim、Deployment和服务。PVC请求20Gi存储,使用NFS存储类。Deployment配置了一个Nexus 3容器,内存限制为6G,CPU为1000m,并挂载数据卷。Service类型为NodePort,通过30520端口对外提供服务。所有资源位于`nexus`命名空间中。
|
3月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
147 60
|
3月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
277 62
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
3月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
|
3月前
|
Kubernetes 监控 测试技术
k8s学习--基于Ingress-nginx实现灰度发布系统
k8s学习--基于Ingress-nginx实现灰度发布系统
133 2
k8s学习--基于Ingress-nginx实现灰度发布系统
|
2月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
62 0
|
3月前
|
存储 Kubernetes 调度

热门文章

最新文章