主機名 | IP |
---|---|
master1 | 172.16.105.21 |
master2 | 172.16.105.22 |
master3 | 172.16.105.23 |
node1 | 172.16.105.24 |
node2 | 172.16.105.25 |
ansible-client | 172.16.105.20 |
在172.16.105.20安裝ansiblenode
# 安裝 python 及 epel yum install -y epel-release python-pip python34 python34-pip # 安裝 ansible yum install -y ansible pip install netaddr pip install --upgrade jinja2
在ansible-clinet機器生成免密密鑰對python
ssh-keygen -t rsa -P ''
將生成的公鑰(id_rsa.pub)傳到其餘節點,這樣ansible-client能夠免密登錄其餘機器nginx
cat id_rsa.pub >> ~/.ssh/authorized_keys
cd /usr/local/src/ wget https://github.com/kubernetes-incubator/kubespray/archive/v2.3.0.tar.gz
本版本所包含的組件版本git
vim roles/docker/tasks/main.ymlgithub
--- - name: gather os specific variables include_vars: "{{ item }}" with_first_found: - files: - "{{ ansible_distribution|lower }}-{{ ansible_distribution_version|lower|replace('/', '_') }}.yml" - "{{ ansible_distribution|lower }}-{{ ansible_distribution_release }}.yml" - "{{ ansible_distribution|lower }}-{{ ansible_distribution_major_version|lower|replace('/', '_') }}.yml" - "{{ ansible_distribution|lower }}.yml" - "{{ ansible_os_family|lower }}.yml" - defaults.yml paths: - ../vars skip: true tags: - facts - include: set_facts_dns.yml when: dns_mode != 'none' and resolvconf_mode == 'docker_dns' tags: - facts - name: check for minimum kernel version fail: msg: > docker requires a minimum kernel version of {{ docker_kernel_min_version }} on {{ ansible_distribution }}-{{ ansible_distribution_version }} when: (not ansible_os_family in ["CoreOS", "Container Linux by CoreOS"]) and (ansible_kernel|version_compare(docker_kernel_min_version, "<")) tags: - facts #禁用docker倉庫,已經使用清華源 #- name: ensure docker repository public key is installed # action: "{{ docker_repo_key_info.pkg_key }}" # args: # id: "{{item}}" # keyserver: "{{docker_repo_key_info.keyserver}}" # state: present # register: keyserver_task_result # until: keyserver_task_result|succeeded # retries: 4 # delay: "{{ retry_stagger | random + 3 }}" # environment: "{{ proxy_env }}" # with_items: "{{ docker_repo_key_info.repo_keys }}" # when: not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS"] or is_atomic) #- name: ensure docker repository is enabled # action: "{{ docker_repo_info.pkg_repo }}" # args: # repo: "{{item}}" # state: present # with_items: "{{ docker_repo_info.repos }}" # when: not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS"] or is_atomic) and(docker_repo_info.repos|length > 0) #- name: Configure docker repository on RedHat/CentOS # template: # src: "rh_docker.repo.j2" # dest: "/etc/yum.repos.d/docker.repo" # when: ansible_distribution in ["CentOS","RedHat"] and not is_atomic #- name: ensure docker packages are installed # action: "{{ docker_package_info.pkg_mgr }}" # args: # pkg: "{{item.name}}" # force: "{{item.force|default(omit)}}" # state: present # register: docker_task_result # until: docker_task_result|succeeded # retries: 4 # delay: "{{ retry_stagger | random + 3 }}" # environment: "{{ proxy_env }}" # with_items: "{{ docker_package_info.pkgs }}" # notify: restart docker # when: not (ansible_os_family in ["CoreOS", "Container Linux by CoreOS"] or is_atomic) and (docker_package_info.pkgs|length > 0) #對於docker的版本檢測進行了保留 - name: check minimum docker version for docker_dns mode. You need at least docker version >= 1.12 for resolvconf_mode=docker_dns command: "docker version -f '{{ '{{' }}.Client.Version{{ '}}' }}'" register: docker_version failed_when: docker_version.stdout|version_compare('1.12', '<') changed_when: false when: dns_mode != 'none' and resolvconf_mode == 'docker_dns' #對於docker的systemd配置,能夠根據本身需求修改,可是注意會覆蓋原來的 - name: Set docker systemd config include: systemd.yml - name: ensure docker service is started and enabled service: name: "{{ item }}" enabled: yes state: started with_items: - docker
由於長城的緣由,須要的鏡像在安裝的時候沒法獲取,因此須要改下源碼,下載本身私有倉的鏡像
腳本內容以下:docker
gcr_image_files=( ./kubespray/roles/download/defaults/main.yml ./kubespray/roles/dnsmasq/templates/dnsmasq-autoscaler.yml.j2 ./kubespray/roles/kubernetes-apps/ansible/defaults/main.yml ) for file in ${gcr_image_files[@]} ; do sed -i 's/gcr.io/docker.emarbox.com/g' $file done
鏡像列表,最好提早下載到私有倉,畢竟下載會很慢vim
gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.1.1 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.5 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.5 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5 gcr.io/google_containers/pause-amd64:3.0 gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.3 nginx:1.11.4-alpine busybox:latest quay.io/coreos/hyperkube:v1.8.1_coreos.0 quay.io/coreos/etcd:v3.2.4 quay.io/calico/ctl:v1.5.0 quay.io/calico/node:v2.5.0 quay.io/calico/routereflector:v0.4.0 quay.io/calico/cni:v1.10.0
能夠對auth的密碼進行修改,網絡插件默認calico,可替換成weave或flannel,還能夠配置是否安裝helm和efk,以及修改安裝路徑服務器
more kubespray/kubespray-2.3.0/inventory/group_vars/k8s-cluster.yml
#六、生成本身的集羣配置網絡
由於kubespray自帶的python腳本是Python3 ,因此要安裝Python3app
yum install -y python-pip python34 python34-pip
# 定義集羣IP IP=( 172.16.105.21 172.16.105.22 172.16.105.23 ) # 利用kubespray自帶的python腳本生成配置 CONFIG_FILE=./kubespray/inventory/inventory.cfg python3 ./kubespray/contrib/inventory_builder/inventory.py ${IP[*]}
查看配置
cat ./kubespray/inventory/inventory.cfg
[all] node1 ansible_host=172.16.105.21 ip=172.16.105.21 node2 ansible_host=172.16.105.22 ip=172.16.105.22 node3 ansible_host=172.16.105.23 ip=172.16.105.23 [kube-master] node1 node2 node3 [kube-node] node1 node2 node3 [etcd] node1 node2 node3 [k8s-cluster:children] kube-node kube-master [calico-rr] [vault] node1 node2 node3
ansible-playbook -i inventory/inventory.cfg cluster.yml -b -v
鏡像地址
kubespray/roles/download/tasks/download_container.yml
從1.8 開始,kubelet 會檢測機器是否有swap,若是啓用swap,kubelet會沒法啓動,須要手動添加參數。
去以下目錄,修改kubelet參數
/usr/local/src/kubespray/kubespray-2.3.0/roles/kubernetes/node/defaults ### fail with swap on (default true) kubelet_fail_swap_on: false
注意機器主機名,要符合k8s的規範
rm -rf /etc/kubernetes/ rm -rf /var/lib/kubelet rm -rf /var/lib/etcd rm -rf /usr/local/bin/kubectl rm -rf /etc/systemd/system/calico-node.service rm -rf /etc/systemd/system/kubelet.service systemctl stop etcd.service systemctl disable etcd.service systemctl stop calico-node.service systemctl disable calico-node.service docker stop $(docker ps -q) docker rm $(docker ps -a -q) systemctl restart docker
[root@node2 .kube]# kubectl get nodes NAME STATUS ROLES AGE VERSION node1 Ready master,node 9m v1.8.1+coreos.0 node2 Ready master,node 9m v1.8.1+coreos.0 node3 Ready master,node 9m v1.8.1+coreos.0
把須要添加的node 寫入配置文件,而後執行ansible
以添加node4舉例
修改 inventory.cfg
[all] node1 ansible_host=172.16.105.21 ip=172.16.105.21 node2 ansible_host=172.16.105.22 ip=172.16.105.22 node3 ansible_host=172.16.105.23 ip=172.16.105.23 node4 ansible_host=172.16.105.37 ip=172.16.105.37 [kube-master] node1 node2 node3 [kube-node] node1 node2 node3 node4 [etcd] node1 node2 node3 [k8s-cluster:children] kube-node kube-master [calico-rr] [vault] node1 node2 node3
ansible-playbook -i inventory/inventory.cfg scale.yml -b -v \ --private-key=~/.ssh/private_key
瞭解ansible,也就能本身隨便搞kubespray,這個東西比較透明,不像kubeadm,封裝很嚴,不知道具體流程,出問題也不知道怎麼處理。