笔记:从0尝试搭建k8s一主一从集群

步骤0:虚拟环境设置

预先需要的环境:首先创建2个虚机超简版,虚机是centos7,网络是net,1cpu,2g内存,30g磁盘

开始搭建:
我们使用的命令没有权限,因此先给用户赋权:
使用xshell连接虚拟机操作更加方便:

步骤1:配置源,配置虚机系统内容,安装基本docker环境

第一部分:

1.配置阿里yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2.这里会发现报错:也就是没有权限
admin is not in the sudoers file. This incident will be reported

3.配置用户权限:
在这里插入图片描述
4.再次执行1,然后执行:
yum makecache
提示:Metadata Cache Created 表示完成第一部分

第二部分:

1.关闭防火墙:防火墙如果不提前关闭,接下来搭建集群会产生各种毛病
执行:sudo systemctl stop firewalld && sudo systemctl disable firewalld

提示:systemctl stop firewalld则完成第二部分

2.关闭swap,Linux的Swap内存交换机制会在内存不足的时候使用磁盘扩展内存的存储,因此会产生严重的性能下降,需提前关闭,否则会因为内存交换而影响性能以及稳定性。

  1. 执行swapoff -a可临时关闭,但系统重启后恢复
  2. 编辑/etc/fstab,注释掉包含swap的那一行即可,重启后(reboot)可永久关闭,如下图:
  3. 或直接执行:sudo sed '/ swap / s/^/#/ /etc/fstab(和上面其实是一个意思)
    在这里插入图片描述
    关闭前:
    在这里插入图片描述
    关闭后:
    在这里插入图片描述
    这里,关闭交换区部分完毕
    注:后面我们知道,我们还需要关闭iptable,因此这也可以直接在这里先处理

第三部分

修改本地的dns信息
查看本地ip,进而获取对应的本地(ifcnf-ens33)文件是哪个:
在这里插入图片描述
在这里插入图片描述
网管查询:
在这里插入图片描述
完成后就可以获取了。

第四部分

安装docker
1.阿里云的Docker仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
但是安装时报错,提示没有:yum-config-manager
这个命令在yum-utils 包里,可以通过先安装yum-utils ,执行:
sudo yum -y install yum-utils

2.安装docker社区版

sudo yum install docker-ce -y

添加aliyundocker仓库加速器
由于cgroupfs”作为Docker cgroup驱动程序。 而推荐的驱动程序是“systemd”,也添加一下:

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://fl791z1h.mirror.aliyuncs.com"],
   "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

3.提示安装完毕后,执行docker version查看版本并确认真正完成安装
在这里插入图片描述
看到上面显示:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
需要执行下面命令:
sudo systemctl daemon-reload
sudo systemctl restart docker.service

4.启动docker 并设置开机自动启动:
sudo systemctl start docker & systemctl enable docker

5.运行,验证是否完成
docker run hello-world

问题:我们发现,每次执行docker都需要sudo,这是因为当前用户没有加入到docker用户组中。

# 查看组
[admin@localhost ~]$ groups
admin
# 将admin加入到docker组
[admin@localhost ~]$ sudo usermod -aG docker admin
#重新登陆当前admin用户
[admin@localhost ~]$ su - admin
Password: 
Last login: Wed May  6 17:19:02 CST 2020 from 192.168.235.1 on pts/0
# 验证是否成功
[admin@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[admin@localhost ~]$ 

至此,步骤1结束。

步骤2:搭建一主一从k8s集群

第一部分

添加阿里k8s源:

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=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

第二部分

关闭SeLinux
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)
由于管理着资源权限,因此我们初学直接关闭,防止接下来莫名的问题,不知道从何查起。
执行:sudo setenforce 0

第三部分

配置主机名:
我们现在有2台虚机,一主一从。
查看IP:
主:192.168.235.133
从:192.168.235.129
修改主机名:
编辑 /etc/hostname,将hostname修改为k8s-node1(重启生效)
设定主机hosts:
编辑 /etc/hosts,追加内容 ip k8s-node?
(所有节点都需要添加ip和hostname:192.168.235.129 k8s-node2192.168.235.133 k8s-node2 从节点内容编辑为:192.168.235.129 k8s-node1)
这样,主节点就可以直接通过k8s-node2访问ip为192.168.235.129的从节点,反之亦然。

第四部分

配置内核参数,将桥接的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

第五部分

安装常用包:
yum install vim bash-completion net-tools gcc -y

第六部分

安装k8s三件套:kubelet、kubeadm、kubectl
执行:
yum install -y kubelet kubeadm kubectl
在这里插入图片描述
完成安装

第七部分

配置kubelet的cgroup drive,需要确保docker 的cgroup drive 和kubelet的cgroup drive一样
但是我这里找不到该文件,我直接跳过:cat: /etc/systemd/system/kubelet.service.d/10-kubeadm.conf: No such file or directory

第八部分

启动kubelet
systemctl enable kubelet && systemctl start kubelet

第九部分

下载K8S的Docker镜像
需要合理上网,当然还有其它方法,下载别人在墙内的资源,然后用脚本导入也行,问题就是安装的东西版本不是最新的,或者指定阿里源。
初始化集群,只在主节点先初始化:

kubeadm init --kubernetes-version=1.18.0  --apiserver-advertise-address=192.168.122.21   --image-repository registry.aliyuncs.com/google_containers  --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

POD的网段为: 10.122.0.0/16, api server地址就是master本机IP。
这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址。
在这里插入图片描述
如上图,完成,最后会返回一句话,用来将其他节点加入:

kubeadm join 192.168.235.132:6443 --token e2wn2a.ns6czdzz5xp2e0hg --discovery-token-ca-cert-hash sha256:289cccfb2142f52b3f5ca67a2d624f3c6c3b3ff6fb9388334598842dc2261275 

结束,执行 docker images检查一下镜像是否已经存在
在这里插入图片描述
这样我们就完成了一台虚机的k8s安装工作,所有文件都已经安装在一台机器上面,因此可以通过直接复制这个虚机就可以得到一个一模一样的另外一台虚机,之前的安装都不需要再做一遍了。当然,作为一个小白,我建议,大家再从头来一遍,对于安装操作这种工作就是一句话:无他,唯手熟尔!!!
执行join in 将其他node节点加入到集群:

第十部分

根据提示创建kubectl

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

执行下面命令,使kubectl可以自动补充
source <(kubectl completion bash)
查看节点,pod

kubectl get node
kubectl get pod --all-namespaces

输出结果:
node节点为NotReady,因为corednspod没有启动,缺少网络pod

第十一部分

安装calico网络
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
在这里插入图片描述
安装完毕,再查看pod和node

kubectl get pod -n kube-system
kubectl get node

在这里插入图片描述

第十二部分

由于我们只有一主一从,K8S集群默认不会将Pod调度到Master上,这样Master的资源就浪费了。
在Master(即k8s-node1)上,可以运行以下命令使其作为一个工作节点:
kubectl taint nodes --all node-role.kubernetes.io/master-
在这里插入图片描述
完成,接下来就把其他节点加进来就ok了。
网上各种乱七八糟的教程让人头大,估计别人看我的也是一样,O(∩_∩)O哈哈~

finish

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是以markdown写一份k8s从入门到精通的操作学习使用笔记手册: # k8s从入门到精通的操作学习使用笔记手册 ## 简介 Kubernetes,缩写为K8s,是一个开源的容器编排平台,旨在自动化应用程序的部署,扩展和管理。它提供了一种简单而灵活的方式来部署和管理容器化应用程序,并且可以快速地实现水平扩展。 在本笔记手册中,我们将介绍Kubernetes的基本概念,并带领大家从入门到精通地学习使用Kubernetes。 ## 基本概念 ### Pod Pod是Kubernetes中的最小部署单元,它是一个或多个容器的集合,这些容器共享网络和存储。Pod在Kubernetes中是一个非常重要的概念,可以用来部署和管理容器化应用程序。 ### Deployment Deployment是一组Pod的控制器,它们负责在Kubernetes集群中创建、更新和删除Pod。Deployment可以保证Pod的副本数量,并监控它们的状态,如果发生故障则可以自动恢复。Deployment还可以实现滚动更新和回滚,以确保应用程序的连续性。 ### Service Service是Kubernetes中的一种抽象概念,它可以将多个Pod作为一个逻辑单元来管理,并提供一个统一的网络入口。Service可以通过标签选择器选择想要连接的Pod,并且支持负载均衡和故障转移。Service是一个非常关键的概念,它可以帮助我们构建可靠和高效的微服务应用程序。 ### ConfigMap ConfigMap是一种以键值对形式存储配置数据的对象,它可以在Kubernetes中共享配置信息。配置数据可以在容器中作为环境变量、命令行参数或者挂载的文件方式使用,可以方便地实现应用程序的集中管理和更新。 ### Secret Secret是一种安全的对象,它可以存储敏感数据,如密码、证书和密钥等。Secret可以以加密的方式存储,确保敏感数据的安全性,同时也可以在容器中使用,方便地实现应用程序的安全管理。 ## 操作学习 ### 安装Kubernetes 首先,我们需要在本地机器或者云环境中安装Kubernetes。你可以根据自己的需求选择使用Minikube、kubeadm或者云平台提供的Kubernetes服务。在这里,我们选择使用Minikube进行本地安装和学习。 Minikube是一个轻量级的本地Kubernetes环境,可以在本地机器上快速安装和启动Kubernetes集群。你可以在官网上下载安装包,然后按照官方文档进行安装。 ### 创建Pod 在安装好Kubernetes后,我们就可以创建第一个Pod了。为了简单起见,我们创建一个简单的Nginx应用程序作为Pod。在创建Pod之前,我们需要编写一个Pod的配置文件。 在本例中,我们创建一个名为nginx.yaml的配置文件,内容如下: ``` apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 ``` 这个配置文件定义了一个名为nginx-pod的Pod,其中包含一个名为nginx的容器,使用最新版的Nginx镜像,并将容器的80端口暴露出去。 我们使用kubectl命令来创建Pod: ``` kubectl create -f nginx.yaml ``` 执行成功后,我们就创建了一个名为nginx-pod的Pod。 ### 创建Deployment 在创建了第一个Pod之后,我们需要更进一步地控制它。为此,我们可以创建一个Deployment来管理Pod,并确保Pod的副本数量。 在本例中,我们创建一个名为nginx-deployment的Deployment,配置文件如下: ``` apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 ``` 这个配置文件定义了一个名为nginx-deployment的Deployment,它包含了两个nginx Pod,并且使用了nginx镜像。 我们使用kubectl命令来创建Deployment: ``` kubectl create -f nginx-deployment.yaml ``` 执行成功后,我们就创建了一个名为nginx-deployment的Deployment,并且Pod副本数量为2。 ### 创建Service 在创建了一个Deployment之后,我们需要将其暴露出去,以便外部用户可以访问应用程序。我们可以使用Service来实现这个功能。 在本例中,我们创建一个名为nginx-service的Service,配置文件如下: ``` apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort ``` 这个配置文件定义了一个名为nginx-service的Service,它将流量转发到包含app=nginx标签的Pod,并将端口80映射到Pod的80端口。 我们使用kubectl命令来创建Service: ``` kubectl create -f nginx-service.yaml ``` 执行成功后,我们就创建了一个名为nginx-service的Service,并将其暴露出去,以便外部用户可以访问应用程序。 ### 使用ConfigMap和Secret 在应用程序开发中,我们通常需要存储和管理一些配置信息和敏感数据。Kubernetes中提供了ConfigMap和Secret来解决这个问题。 ConfigMap和Secret可以通过kubectl命令进行创建和管理。在创建ConfigMap和Secret时,我们需要首先将配置数据和敏感数据转换成键值对的形式,并存储在配置文件中。然后,我们使用kubectl命令来创建ConfigMap和Secret。 在本例中,我们创建了一个名为nginx-config的ConfigMap,配置文件如下: ``` apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: nginx.conf: | server { listen 80; server_name example.com; location / { proxy_pass http://localhost:8080; } } ``` 这个配置文件定义了一个名为nginx-config的ConfigMap,其中包含了一个名为nginx.conf的配置文件。 我们使用kubectl命令来创建ConfigMap: ``` kubectl create configmap nginx-config --from-file=nginx.conf ``` 执行成功后,我们就创建了一个名为nginx-config的ConfigMap,并将其存储在Kubernetes中。 类似地,我们创建了一个名为nginx-secret的Secret,用来存储敏感数据: ``` apiVersion: v1 kind: Secret metadata: name: nginx-secret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm ``` 我们使用kubectl命令来创建Secret: ``` kubectl create secret generic nginx-secret --from-literal=username=admin --from-literal=password=123456 ``` 执行成功后,我们就创建了一个名为nginx-secret的Secret,并将其存储在Kubernetes中。 ### 总结 本文介绍了Kubernetes的基本概念,并带领大家从入门到精通地学习了Kubernetes的操作。在实际应用程序开发中,Kubernetes是一个非常强大的工具,可以帮助我们实现应用程序的自动化部署、扩展和管理,同时也可以提高应用程序的可靠性和高可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值