使用kubeadm部署k8s集群1.15.0版本
安装kubeadmin1.15.0一:整体架构192.168.11.130 master1192.168.11.131 node1192.168.11.132 node2kubeadm:可以把kubeadmin看成一个部署工具,它简化K8s的部署过程。二:准备工作(master、node1、node2执行)检查master、node1、node2是否能上外网 关闭防火墙systemctl stop
1.3 Kubernetes集群架构组件
1)Master组件
kube-apiserver
(Kubernetes API)集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的
kube-schedule
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
2)Node组件
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker 或 rocket
容器引擎,运行容器
1)Pod
最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
Pod是短暂的
2)Controller
ReplicaSet:确保预期的Pod副本数量
Deployment:无状态应用部署
StatefulSet:有状态应用部署
DaemonSet:确保所有Node运行同一个Pod
Job:一次性任务
Cronjob:定时任务
3)更高级层次对象,部署和管理Pod
Service:
防止Pod失联;定义一次Pod的访问策略
Service抽象层不过是iptables或者ipvs中的规则而已
Label:标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces:命名空间,将对象逻辑上隔离
Annotations:注释
4)网络解决方案
K8S通过CNI插件体系来接入外部网络服务解决方案
常见的有:
flannel:网络配置相关
calico:网络配置、网络策略
canel:flannel的网络配置 + calico的网络策略
5)三种网络
Pod网络:Pod的地址是配置在Pod内部的网络名称空间上的,是能ping通的,就像正常主机上的地址一样
Service网络(集群网络):Service的地址是虚拟的,它只存在于iptables或者ipvs的规则之中
节点网络:各个节点也应该有一个网络
各个Pod运行在同一个网络中,而service是另外一个网络;Pod和service的地址是不同网段的。
接入外部访问时,先接入节点网络,然后由节点网络代理至集群网络,再由集群网络代理至Pod网络。
同一Pod内的多个容器之间通过 lo 接口进行通信。
两个Pod之间可以直接进行通信:通过隧道的方式(Overlay叠加网络)来转发二层报文,使得它们虽然扩主机但是好像工作在同一个二层网络中。访问对方Pod所在节点的位置,然后再代理到Pod内部的容器上。
安装kubeadmin1.15.0
在不同的节点上执行下面命令
hostnamectl set-hostname master1
hostnamectl set-hostname node1
hostnamectl set-hostname node2
一:整体架构
192.168.11.130 master1
192.168.11.131 node1
192.168.11.132 node2
- kubeadm:可以把kubeadmin看成一个部署工具,它简化K8s的部署过程。
二:准备工作(master、node1、node2执行)
检查master、node1、node2是否能上外网 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
- 关闭SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
getenforce
- 禁用Swap
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
在所有的Kubernetes节点执行以下脚本(若内核大于4.19替换nf_conntrack_ipv4为nf_conntrack):
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#执行脚本
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#安装相关管理工具
yum install ipset ipvsadm -y
服务器校对时间
# 安装 chrony 服务,centos7.8默认自带了,没有的按如下安装
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
- 配置主机ip映射及主机名
cat <<EOF >> /etc/hosts
192.168.11.130 master1
192.168.11.131 node1
192.168.11.132 node2
EOF
cat /etc/hosts
reboot
安装docker
yum -y install wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version
配置Docker的镜像加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://nu4ynvqu.mirror.aliyuncs.com"]
}
{
"log-driver": "json-file",
"log-opt": {
"max-size": "100m",
"max-file": "3"
}
EOF
配置阿里云的Kubernetes源
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
- 配置内核参数,将桥接的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
- systemd驱动
vim /usr/lib/systemd/system/docker.service
#修改为systemd
ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd
systemctl daemon-reload
systemctl restart docker
- 所有节点安装kubeadm,kubelet和kubectl。(指定版本安装,不指定默认最新版本安装;)缘由:kubelet运行在 Cluster 所有节点,负责启动 Pod 和容器,kubeadm 用于初始化 Cluster,Kubectl是kubernetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源、创建、删除和更新各种组件。
yum install -y kubeadm-1.15.0-0 kubectl-1.15.0-0 kubelet-1.15.0-0
systemctl enable kubelet
三:初始化(master执行)
kubeadm config images list
kubeadm init --apiserver-advertise-address=192.168.11.130 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
–image-repository
string:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
最后生成的命令记录下来,后边使用kubeadm join往集群中添加节点时会用到;
kubeadm join 192.168.11.130 --token qd3apb.ly13dx5944yxhykw --discovery-token-ca-cert-hash sha256:71de75d66c44eb49c4a330714df6183ec3eb46d1952bc951474724eb44aef0d5
配置 kubectl
命令
无论在master节点或node节点,要能够执行kubectl
命令必须进行以下配置,从节点没有/etc/kubernetes/admin.conf就拷贝过去执行以下命令
mkdir -p $HOME/.kube
scp -r /etc/kubernetes/admin.conf root@node1:/etc/kubernetes/
scp -r /etc/kubernetes/admin.conf root@node2:/etc/kubernetes/
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
cat << EOF >> ~/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source ~/.bashrc
查看k8s
节点情况
[root@k8s-master1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master1 NotReady master 7m46s v1.15.0
此时主节点状态为NotReady
,因为我们k8s
集群要求一个扁平化的网络存在,由于我们还没构建flanneld
网络插件。由于在上面 kubeadm init
后,我们没有进行kubeadm join
所有现在我们还看不到 node
的信息
四:安装flannel(master执行)在master节点上安装即可,其他节点加入k8s集群后会自动安装
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~]# mkdir k8s
wget -P k8s/ https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 访问不了这个网址,下不下来,可以借助阿里云的ECS可以下载
# kube-flannel.yml 里面的镜像地址quay.io/coreos/flannel:v0.13.0 拉取不下来,修改为国内的地址后,还拉取不下来,
# 由于是镜像,可以把该镜像从github拉下来,https://github.com/coreos/flannel/releases,然后
docker load -i flanneld-v0.13.0-amd64.docker如果flannel因为网络问题安装失败,需要进行重新安装 kubectl delete -f kube-flannel.yml # 然后重新安装 kebectl apply -f kube-flannel.yml
docker images 查看镜像名称,将kube-flannel.yml里的两个镜像地址改成本地镜像名称和版本,就可以在本地拉取制作镜像了,注意镜像名称和配置文件里的一定要一致,当时我是电脑倒入。
或者
docker pull jinbian/flannel:v0.12.0-amd64
vi kube-flannel.yml
# 再次执行部署flannel
kubectl apply -f kube-flannel.ymlkubectl get pod -n kube-system
kubectl get nodes
五:加入node1、node2节点(node1、node2节点运行)
kubeadm join 192.168.11.130:6443 --token qd3apb.ly13dx5944yxhykw --discovery-token-ca-cert-hash sha256:71de75d66c44eb49c4a330714df6183ec3eb46d1952bc951474724eb44aef0d5
在 master1
上查看 节点和各个组件以pod的方式来运行的状态
kubectl get pod -n kube-system -o wide
kubectl get nodes
kube-proxy
开启ipvs
kubectl get configmap kube-proxy -n kube-system -o yaml > kube-proxy-configmap.yaml
sed -i 's/mode: ""/mode: "ipvs"/' kube-proxy-configmap.yaml
kubectl apply -f kube-proxy-configmap.yaml
rm -f kube-proxy-configmap.yaml
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
查看IPVS
配置
yum install -y ipvsadm
ipvsadm -ln
补充扩展:k8s
的图形化管理工具之 kuboard
wget https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f kuboard.yaml
# 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令# 获取token,为登录kuboard做准备
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
访问地址:http://192.168.11.130:32567
Kubernetes集群信息查看及管理
3.1 Pod的创建与查看
1)信息查看
# 查看k8s集群的整体信息
kubectl cluster-info
# 查看当前系统上已经被创建的控制器
kubectl get deployment
# 查看pod的相关信息
kubectl get pods
kubectl get pods -o wide # 查看更详细的信息
# 查看services的相关信息
kubectl get services
kubectl get svc
# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system
2)创建一个pod
# 创建并运行一个特定的镜像,暴露80端口,并且只创建1个副本,干跑模式需要再加上--dry-run=true
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1
# 如果要镜像中运行其他程序,可以写成这样(注意前面要加 -- )
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1 -- /bin/sh
3)对刚刚创建的pod进行查看并访问
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy 1/1 Running 0 3m6s 10.244.1.2 k8s-node01 <none> <none>
[root@k8s-master01 ~]# curl 10.244.1.2
3.2 创建pod并暴露端口
在Kubernetes集群中创建一个pod,然后暴露端口,验证其是否可以正常访问
1)创建deployment
# 创建一个deployment控制器,这个控制器的名字就叫nginx-deploy
kubectl create deployment nginx-deploy --image=nginx
2)创建service并暴露端口
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # 将nginx-deploy这个控制器(deployment )相关的pod资源都创建为一个服务,服务名叫nginx
# --name 是service的名称
# --port 是service暴露到外部的端口
# --target-port 是pod暴露的端口
# --protocol 使用的协议,默认就是TCP
# --type 是service的类型,service有多种类型,可kubectl expose --help来查看--type选项,Defaultis 'ClusterIP'
3)查看相关信息并访问
# 查看pod和service的相关信息
[root@k8s-master01 ~]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-8588f9dfb-t8wzr 1/1 Running 0 11m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 78m
service/nginx ClusterIP 10.99.193.184 <none> 80/TCP 34s
# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system
# 访问:http://NodeIP:PORT,只有在集群内部的节点上才能被访问到
curl http://10.99.193.184
删除节点
设置节点不可调度
#kubectl cordon local-k8s-nd01
驱逐节点上的pod
#kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
删除节点
#kubectl delete node k8s-node1
在需要删除的节点上执行reset,这样该节点即完全从 Cluster 中脱离开来
#kubeadm reset
六:常用命令
- 重置集群节点命令 kubeadm reset
- 查询join命令 kubeadm token create --print-join-command
七:服务部署
更多推荐
所有评论(0)