centos7安装kubeadm
一、基础设置
1、设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname node01
vim /etc/hosts
192.168.198.169 master
192.168.198.170 note01
hostnamectl
hostnamectl 是在 centos7 中新增加的命令,它是是用来管理给定主机中使用的三种类型的主机名
在CentOS7中有三种定义的主机名:静态的(static)、瞬态的(transient)、和灵活的(pretty)。“static”主机名是可由用户选择的传统 hostname,并保存在 /etc/hostname 文件中。 “transient” hostname 是由内核维护的动态主机名。它最初是默认的 static 主机名,其值默认为 “localhost”。 可由 DHCP 或 mDNS 在运行时更改其默认值。“pretty” hostname 是为用户提供的任意格式 UTF8 主机名
hostnamectl 用法
-h --help 显示帮助
--version 显示安装包的版本
--transient 修改临时主机名
--static 修改瞬态主机名
--pretty 修改灵活主机名
-p --privileged 在执行之前获得的特权
--no-ask-password 输入密码不提示
-h --host=[USER@]HOST 设置主机平台类型名
Commands:
status 显示当前主机名设置
set-hostname NAME 设置系统主机名
set-icon-name NAME 为主机设置icon名
set-chassis NAME 设置主机平台类型名
具体用法
hostnamectl status
如果未指定任何选项,则默认使用 status 选项
hostnamectl <==> hostnamectl status
设定所有主机名
hostnamectl set-hostname 主机名
这样会将 pretty 、 static 、 和 transient 主机名变得相似。 Static 和 transient 主机名会简化为 pretty 主机名格式。使用 “-” 替换空格,并删除特殊字符。
过程
# hostname
localhost.localdomain
# hostnamectl set-hostname xsnq
# hostname //查看主机名已近修改成功
xsnq
// 这里远程登录(CRT)重新连接服务器也可以
# init 6 //重启服务器
# // 主机名显示也修改完成
设定/清除特定主机名
hostnamectl set-hostname "" option...
过程
# hostname
xsnq
# hostnamectl set-hostname "" --static
# hostname // 此时清除成功,但还未生效
xsnq
# init 6 // 重启
# hostname // 已还原成默认形式
localhost.localdomain
hostname和hostnamectl 区别
hostname 临时修改主机名;
hostnamectl 永久修改主机名,是对 /etc/hostname 文件的内容进行修改
/etc/hosts
主机名查询静态表,是ip地址与域名快速解析的文件。ip地址与主机名之间的映射,包括主机的别名。
通常将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问
如果没有域名解析(DNS),操作系统需要查询该文件来解析对应主机名的ip地址;如果有域名解析(DNS),也可以设置该文件,优先级:DNS缓存 > /etc/hosts/ > DNS服务
ssh免登录
ssh-keygen # node 生成密钥, 一路回车
ssh-copy-id user@host # master 拷贝密钥
ssh-keygen命令
ssh-keygen 用来生成ssh公钥认证所需的公钥和私钥文件
ssh 密钥登录特点:1、安全;2、免输密码
对于安全级别较高的服务器,建议配好 ssh 登录后禁掉密码登录。
缺点:略繁琐。如果你的只是临时登录一次,那么还是密码吧。
一、生成密钥
秘钥对需要在你自己的机器上生成,然后把公钥放到服务器相应用户的 ~/.ssh 目录
执行下面命令,默认生成位置是 ~/.ssh
ssh-keygen
系统会询问你文件名和秘钥密码,可以一路回车过去,会生成两个文件:
- id_rsa 私钥
- id_rsa.pub 公钥
默认使用rsa算法,你也可以用比较详细的指令,如
ssh-keygen -t rsa -b 1024 -f yourkeyname -C "备注"
参数 | 解释 |
---|---|
-b | 采用长度1024 bit 的密钥对,b=bits, 最长 4096,不过没啥必要 |
-t rsa | 采用 rsa 加密方式, t=type |
-f | 生成文件名, f=output_keyfiles |
-C | 备注, C=momment |
更多参数可运行 man ssh-keygen
ssh-copy-id 命令
ssh-copy-id 命令可以把本地的 ssh 公钥文件安装到远程主机对应的账户下。
达到的功能
ssh-copy-id - 将你的公钥 密钥 填充到一个远程机器上的 authorized_keys 文件中。
使用模式:
ssh-copy-id [-i [identity_file]][user@]machine
描述
ssh-copy-id 是一个实用 ssh 去登陆到远程服务器的脚本(假设使用一个登录密码,因此,密码认证应该被激活直到你已经清理了做 了多个身份的使用)。
它也能够改变远程用户名的权限,~/.ssh 和 ~/.ssh/authorized_keys 删除群组写的权限(在其他方面,如果远程机上的 sshd 在它的位置文件中是严格模式的话,这能够组织你登陆)。
如果这个 “-i” 选项已经给出了,然后这个认证文件(默认是 ~/.ssh/id_rsa.pub)被使用,不管在你的 ssh-agent 那里是 否有任何密钥。另外,命令 “ssh-add -L” 提供任何输出,它使用这个输出优先于身份认证文件。如果给出了 “-i” 选项, 或者 ssh-add 不产生输出, 它使用 ssh 将这些指纹填充到远程机 ~/.ssh/authorized_keys 文件中
ssh-keygen 产生公钥与私钥对。
ssh-copy-id 将本机的公钥复制到远程机器的 authorized_keys 文件中,
ssh-copy-id 也能让你有到远程机器的 home , ~./ssh , 和 ~/.ssh/authorized_keys 的权利
第一步:在本地机器上使用 ssh-keygen 产生公钥私钥对
ssh-keygen
第二步:用 ssh-copy-id 将公钥复制到远程机器中
ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host
第三步:登录到 远程机器不用输入密码
ssh remote-host
常见问题:
ssh-copy-id -u eucalyptus -i ~eucalyptus/.ssh/id_ras.pub eucalyptus@remote_host
上述是给 eucalyptus 用户赋予无密码登录的权利
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
禁用 SELINUX
# 将 SElinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive' /etc/selinux/config
SELinux是什么?
SELinux 是 Security Enhanced Linux 缩写,采用委任式存取控制,是在进行程序、文件等细节权限设置依据的一个核心模块
SELinux(Security-Enhanced Linux)是 linux 系统中强制访问控制模块,是linux 历史上最杰出的新安全子系统,由 NSA (美国国家安全局)和 linux 社区共同开发出来的,它是一种访问控制体系,在这种访问控制体系下,进程只能访问进程任务中需要的文件。默认安装在 Fedora 和 Red Hat Enterprise Linux 上。也可安装在其他 linux发行版本上。
SELinux 是 2.6 及更高版本的 linux 内核中提供的强制访问控制(MAC)系统。对于目前可用的 linux 安全模块来说, SELinux 是功能最全面,而且测试最充分的,已作为 linux 内核模块, 包含在 linux 内核中。启用该访问模块,进程无法随意访问不包含在任务之中的文件,或路径
存取控制
自主式(DAC)
当程序要操作文件时,系统根据程序 Owner/Group,对比文件的权限,若通过权限检查,则可操作文件,但可能造成问题:
- root 具有最高权限,若某程序属于 root,则该程序可操作系统的任务文件
- 使用者可利用程序来变更文件的权限
委任式(MAC)
也即是SELinux所采用的方式,可针对特定程序与特定文件来进行权限控制
- 即使是 root ,在使用不同程序时所取到的权限也不一定是 root ,而是根据该程序的设定
- 程序也不能任意使用系统文件,因为每个文件也有针对该程序可用的权限设定
SELinux组成
主要组成部分为 Subject、Object、Policy 和 security context
Subject 即是要管理的程序, Object 即是要操作的文件系统, Policy 为基本的存取安全性策略,分别为
- targeted:针对网络服务限制较多,针对本机限制较少,是默认政策
- minimun:由 target 修改而来,仅针对选择的程序来保护
- mls:完整的权限限制,限制方面较为严格
Subject 与 Object 的 security context 要一致才能顺序存取,其分为3个部分
- Identity:unconfined_u 表示文件来自不受限制程序产生, system_u 表示文件由系统产生
- Role:object_r 表示文件, system_r 表示程序或一般使用者, unconfined_r 表示不受限角色
- Type:在 Subject 则称为 domain, 在 Object 中称为 Type,两者需一致
SELinux 安装
systemctl stop apparmor
apt purge apparmor
apt update && sudo apt upgrade -yuf
apt install policycoreutils selinux-utils selinux-basics
SELinux开关及模式
- enforcing:强制模式,表示 SELinux 运行中,且正在限制 domain/type
- permissive:宽容模式,表示SELinux运行中,但仅有警告信息并未限制 domain/type,多用于 debug
- disabled:关闭
命令 getenforce 可获取 SELinux 的模式,上面安装完后,默认为 disabled
命令 setenforce 设置 SELinux模式,0 为 permissive,1为enforcing,但实际上只能在开机状态下切换 enforcing 和 permissive ,而不能从 disabled 直接切换为 enforcing 或 permissive,反之也不行
故想要打开 SELinux,需通过 vi 将 /etc/selinux/config 的 SELINUX = disabled 改为 permissive 或 enforcing
关闭swap分区
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
Linux swap 分区及作用详解
我们在安装系统的时候已经建立了 swap 分区。 swap分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换区中,从而为当前运行的程序腾出足够的内存空间
允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
放行端口
控制平面节点
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 6443 | Kubernetes API 服务器 | 所有组件 |
TCP | 入站 | 2379-2380 | etcd 服务器客户端 API | kube-apiserver, etcd |
TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
TCP | 入站 | 10251 | kube-scheduler | kube-scheduler 自身 |
TCP | 入站 | 10252 | kube-controller-manager | kube-controller-manager 自身 |
工作节点
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
TCP | 入站 | 30000-32767 | NodePort 服务† | 所有组件 |
安装 v-1.17 的 kubeadm/kubelet/kubectl
由于 kubeadm 的官方源在国外,所以如果不科学上网的情况下,直接下载 kubeadm 以及 kuberenets 集群组件镜像(k8s.gcr.io)会非常缓慢,这里我们直接采用阿里云的 kubernetes 镜像库来进行安装。
(1)先配置 kubeadm 的安装源:
CentOS / RHEL / Fedora
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
setenforce 0
查看可安装的 kubeadm 版本:
[root@node13 ~]# yum list kubeadm --showduplicates|sort -r
已加载插件:fastestmirror
已安装的软件包
可安装的软件包
* updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
kubeadm.x86_64 1.9.9-0 kubernetes
kubeadm.x86_64 1.9.8-0 kubernetes
kubeadm.x86_64 1.9.7-0 kubernetes
kubeadm.x86_64 1.9.6-0 kubernetes
kubeadm.x86_64 1.9.5-0 kubernetes
kubeadm.x86_64 1.9.4-0 kubernetes
选择安装 v1.17.17-0 的 kubeadm:
[root@node13 yum.repos.d]# yum install kubelet-1.17.17-0 kubeadm-1.17.17-0 kubectl-1.17.17-0 -y
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
...
kubernetes | 1.4 kB 00:00:00
...
已安装:
kubeadm.x86_64 0:1.17.17-0 kubectl.x86_64 0:1.17.17-0 kubelet.x86_64 0:1.17.17-0
作为依赖被安装:
kubernetes-cni.x86_64 0:0.8.7-0
完毕!
# 警用swap
[root@node13 ~]# sudo swapoff -a
#设置kubelet开机启动
[root@node13 yum.repos.d]# systemctl enable kubelet && systemctl start kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
#重启docker服务
[root@node13 ~]# systemctl daemon-reload
[root@node13 ~]# systemctl restart docker
3. 预下载 k8s 集群组件镜像
执行 kubeadm init 执行节点安装 k8s 集群时,最大的问题是在此过程中会去 k8s.gcr.io 的 kubernetes 官方镜像源下载 k8s 组件的镜像,所以我们可以提前预下载所需要的组件镜像:
查看 kubeadm init 时所需要的组件镜像列表:
[root@node13 ~]# kubeadm config images list
I0415 13:20:10.609056 5888 version.go:251] remote version is much newer: v1.21.0; falling back to: stable-1.17
W0415 13:20:11.388040 5888 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0415 13:20:11.388070 5888 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
编写脚本,使用阿里云的 k8s 官方镜像源来下载这些镜像:
脚本的作用是从阿里云的 kubernetes 镜像源拉取镜像到本地,然后修改镜像的标签,以符合 k8s.gcr.io 的地址格式
- 根据kubeadm config images list命令,编辑pull-k8s-images.sh。
#创建pull-k8s-images.sh
[root@node13 yum.repos.d]# vim pull-k8s-images.sh
for i in k8s.gcr.io/kube-apiserver:v1.17.17 k8s.gcr.io/kube-controller-manager:v1.17.17 k8s.gcr.io/kube-scheduler:v1.17.17 k8s.gcr.io/kube-proxy:v1.17.17 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.5; do
temp=${i#k8s.gcr.io/}
docker pull registry.aliyuncs.com/google_containers/${temp}
docker tag registry.aliyuncs.com/google_containers/${temp} k8s.gcr.io/${temp}
docker rmi registry.aliyuncs.com/google_containers/${temp};
done;
#修改会可执行文件
[root@node13 yum.repos.d]# chmod +x pull-k8s-images.sh
#执行文件
[root@node13 yum.repos.d]# ./pull-k8s-images.sh
..
..
Digest: sha256:7ec975f167d815311a7136c32e70735f0d00b73781365df1befd46ed35bd4fe7
Status: Downloaded newer image for registry.aliyuncs.com/google_containers/coredns:1.6.5
registry.aliyuncs.com/google_containers/coredns:1.6.5
Untagged: registry.aliyuncs.com/google_containers/coredns:1.6.5
Untagged: registry.aliyuncs.com/google_containers/coredns@sha256:7ec975f167d815311a7136c32e70735f0d00b73781365df1befd46ed35bd4fe7
#检查是否下载成功
[root@node13 yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.17.17 3ef67d180564 3 months ago 117MB
k8s.gcr.io/kube-controller-manager v1.17.17 0ddd96ecb9e5 3 months ago 161MB
k8s.gcr.io/kube-apiserver v1.17.17 38db32e0f351 3 months ago 171MB
k8s.gcr.io/kube-scheduler v1.17.17 d415ebbf09db 3 months ago 94.4MB
k8s.gcr.io/coredns 1.6.5 70f311871ae1 17 months ago 41.6MB
k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 17 months ago 288MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 3 years ago 742kB
4. master节点初始化 k8s 集群
以下步骤,只对于master节点
[root@node13 ~]# kubeadm init --apiserver-advertise-address=192.168.255.132 --kubernetes-version v1.17.17 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.255.132:6443 --token vkidlc.wmwtmuv4doua1b86 \
--discovery-token-ca-cert-hash sha256:8ea01d6c8881b80004102447cf0b6c5d11700d771e88eaccbaddae5048688618
安装成功
#按安装成功提示的增加config
[root@node13 ~]# mkdir -p $HOME/.kube
[root@node13 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@node13 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
5.slave节点加入集群
slave节点重复 2、3步骤。
加入集群节点只需执行master节点创建集群的命令
#加入集群
[root@node14 ~]# kubeadm join 192.168.255.132:6443 --token vkidlc.wmwtmuv4doua1b86 \
> --discovery-token-ca-cert-hash sha256:8ea01d6c8881b80004102447cf0b6c5d11700d771e88eaccbaddae5048688618
#结果
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
o apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.