kubeadm 关闭 kubernetes_bash

开源容器应用自动化部署技术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里面的;