使用kubeadm部署一个K8s集群

Kubernetes 系统简介

Kubernetes优势:

- 容器编排
    - 轻量级
    - 开源
    - 弹性伸缩
    - 负载均衡

Kubernetes 特性

Endpoint Slices

Kubernetes 集群中网络端点的可扩展跟踪。

服务发现与负载均衡

无需修改您的应用程序即可使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个 DNS 名称,并且可以在它们之间实现负载平衡。

自我修复

重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会它们公布给客户端。

自动装箱

根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,将任务关键工作负载和尽力服务工作负载进行混合放置,以提高资源利用率并节省更多资源。
IPv4/IPv6 双协议栈
Allocation of IPv4 and IPv6 addresses to Pods and Services
水平伸缩
使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行伸缩。

Kubernetes的Master和Node节点

1.Master

k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点Node。Kubernetes API server提供HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口。也是集群控制的入口进程;Kubernetes Controller Manager是Kubernetes所有资源对象的自动化控制中心;Kubernetes Schedule是负责资源调度(Pod调度)的进程

2.Node

Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy.
每个Node节点都运行着以下一组关键进程
kubelet:负责对Pod对于的容器的创建、启停等任务
kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件
Docker Engine(Docker):Docker引擎,负责本机容器的创建和管理工作

Node节点可以在运行期间动态增加到Kubernetes集群中,默认情况下,kubelet会想master注册自己,这也是Kubernetes推荐的Node管理方式,kubelet进程会定时向Master汇报自身情报,如操作系统、Docker版本、CPU和内存,以及有哪些Pod在运行等等,这样Master可以获知每个Node节点的资源使用情况,冰实现高效均衡的资源调度策略。

Kubernetes Node运行节点,运行管理业务容器,包含如下组件:

1.Kubelet
    负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。
2.Kubernetes Proxy
    负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service信息,并根据Service的信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。
3.Docker
    Node上需要运行容器服务

部署k8s的方式:

Minikube 单节点微型K8S(仅供学习、预览使用)
二进制安装部署:(生产首选,新手推荐)
使用kubeadmin进行部署,K8S的部署工具,跑在K8S里(相对简单,熟手推荐)

部署k8s的标准:

k8s最基本的硬件要求
CPU: 双核
Mem: 2G
3台dockerhost
时间必须同步
配置三台服务器的环境

使用kubeadm部署一个K8s集群

k8s-master	192.168.40.111
k8s-node1	192.168.40.112
k8s-node2	192.168.40.113

关闭防火墙:

systemctl stop firewalld
systemctl disable firewalld

关闭selinux:

sed -i 's/enforcing/disabled/' /etc/selinux/config  
setenforce 0  

关闭swap

swapoff -a  
sed -i 's/.*swap.*/#&/' /etc/fstab

设置主机名

hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

在所有主机添加hosts

 cat >> /etc/hosts << EOF
192.168.40.111 k8s-master
192.168.40.112 k8s-node1
192.168.40.113 k8s-node2
EOF

将桥接的IPv4流量传递到iptables的链:

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

生效命令

sysctl --system  

重启服务器做时间同步

重启服务器

reboot

安装命令

yum install ntpdate -y

同步时间

ntpdate ntp.aliyun.com

所有节点安装Docker/kubeadm/kubelet
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

安装wget

yum -y  install wget

获取阿里云的源

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

安装docker

yum -y install docker-ce-18.06.1.ce-3.el7

启动docker并设为开机自启

systemctl enable docker && systemctl start docker

查看docker版本

docker --version

配置镜像加速

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

重启docker服务

systemctl restart docker

添加阿里云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

5.3 安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:

yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0

将kubelet设为开机自启,先不启动

systemctl enable kubelet

部署Kubernetes Master
在192.168.153.151 (Master)执行

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

初始化成功之后出现以下界面
使用kubeadm部署一个K8s集群_第1张图片

执行命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装Pod网络插件(CNI)
在master上执行
安装官网的插件

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

安装失败时可以下载我上传的kube-flannel.yml 文件,其中镜像地址已经修改
下载链接>> https://download.csdn.net/download/m0_46674735/14930704
执行命令:kubectl apply -f kube-flannel.yaml 安装即可

[root@host-151 ~]# kubectl apply -f kube-flannel.yaml 
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created

查看pods状态已经全部running

[root@host-151 ~]# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-9d85f5447-gc8rh              1/1     Running   0          4m39s
coredns-9d85f5447-lr8d9              1/1     Running   0          4m39s
etcd-k8s-master                      1/1     Running   0          4m53s
kube-apiserver-k8s-master            1/1     Running   0          4m53s
kube-controller-manager-k8s-master   1/1     Running   0          4m53s
kube-flannel-ds-amd64-sjrbq          1/1     Running   0          104s
kube-proxy-rf842                     1/1     Running   0          4m39s
kube-scheduler-k8s-master            1/1     Running   0          4m53s

加入Kubernetes Node
加入集群
在192.168.153.152/153 上执行
命令由初始化master之后生成,直接复制即可

kubeadm join 192.168.153.151:6443 --token 4ewer2.chl3n0wtfi36xc6c \
    --discovery-token-ca-cert-hash sha256:78512851a2e78e14ea454f0a65e9853f9085ec8348a2e0f781347fa5c882f53a 

查看节点加入成功

[root@host-151 ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   5m9s    v1.17.0
k8s-node1    Ready    <none>   2m58s   v1.17.0
k8s-node2    Ready    <none>   2m54s   v1.17.0

部署 Dashboard
在master节点上执行命令

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

执行失败时可以用上传的文件执行下面这条命令:
下载链接>> https://download.csdn.net/download/m0_46674735/14930771

kubectl apply -f kubernetes-dashboard.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部,文档中已经修改,直接运行即可

在master节点上执行以下命令

创建service account并绑定默认cluster-admin管理员集群角色:

kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

命令执行成功后会生成token

Data
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg0U010UFVlSnIyZGNtX0tibW9Uc09SNVVFcXF6bUp5Rm9iaDAxX3NtNkU
ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3V
udC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm
5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4td3hnd3oiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L
3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNj
b3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMzM4YWNkMGYtYzZhMS00ODUyLTlhMDQtN2QxMDZkMjQ1MGM2Iiw
ic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.AB29CeywV
V67WJtGGebBMJG4sdx9Zff2FRPUtGAkVtKxjUJ2R9AYyIhvJnlxGjCdT2f9wnzoqcps0wXFL-
HAUYbjYd76KZtwT7JopDkNxzo4jVXTQz30sXiYACDU0e914MTsK33pUaK_Fun9nrkmRw71f7N6Ocms9guT5Mccl
XgKr4P-ckP8JShum4fNv2z7SnDK41hq3LM3-ptP3eZShRFcb9-4LnTabRh80T76sVNXC-
2ytnzdum3_lZH53GZO8mMm_z__8SDrKJV27JFcxwE8u9O3EDiU_lxLOEv1fw6kACuRI8YmNP2N-
Ab4w07eh7Qt8PcIEGZcx13N4O3HIQ

访问ip
使用kubeadm部署一个K8s集群_第2张图片
以谷歌浏览器为例
使用kubeadm部署一个K8s集群_第3张图片

显示以上图时
随便点击页面的空白处,然后输入:thisisunsafe就可以了

也可参考:https://segmentfault.com/a/1190000021843971

点击token,将上面生成的token粘贴进去
使用kubeadm部署一个K8s集群_第4张图片
访问成功
使用kubeadm部署一个K8s集群_第5张图片

至此搭建完毕

你可能感兴趣的:(自动化,linux,k8s,运维)