Comment déployer Openshift Origin sur AWS

Qu'est-ce que Openshift

Openshift est une plate-forme d'orchestration Container développée par Redhat et basée sur Kubernetes. Openshift Origin est la version de la communauté. Openshift étend les capacités de Kubernetes, qui vous fournissent une interface agréable pour votre pipeline CI / CD.

Où commencer?

Commencez avec un essai gratuit si vous voulez seulement apprendre Openshift. Mais si vous essayez de créer des ressources Openshift pour un produit, le compte d'essai peut ne pas être la solution.

J'ai fait face à ce dernier problème et j'ai décidé de configurer mon propre cluster Openshift Origin 3.11 à l'aide d'instances AWS EC2.

Combien ça va coûter?

Ce cluster est composé de trois nœuds et conformément à la spécification, je suis venu avec la configuration suivante,

  • Noeud principal (t2.xlarge, 30 Go EBS)
  • Deux nœuds de travail (t2.large, 30 Go EBS)

Notez que vous pouvez bien essayer cela avec différentes instances car cela dépend non seulement de la configuration requise pour Openshift, mais également de celle du produit. Vous pouvez trouver plus de détails concernant les types d'instance AWS ici.

Puisque nous utilisons Centos 7.5, le système d’exploitation est gratuit.

Création de ressources AWS

Nous avons besoin de 3 instances EC2 avec les stratégies de sécurité suivantes.

Je sais que c’est vraiment ennuyeux de créer ces règles manuellement, alors ne vous inquiétez pas, avec la formation Cloud, cela peut être fait en quelques clics. Utilisez le script de formation en nuage ci-dessous et déployez les instances EC2 avec les stratégies de sécurité et le montage ESB. Utilisez la console AWS pour trouver les informations suivantes,

  • Recherchez l’ID AMI de CentOS 7 (x86_64) - avec les mises à jour HVM dans la région de votre choix (AMI_ID)
  • Créer une paire de clés SSH pour le cluster
  • Obtenez l'ID VPC par défaut (VPC_ID) dans la région souhaitée

Remplacez AMI_ID et VPC_ID par les valeurs correctes dans la formation Cloud suivante et déployez-les.

AWSTemplateFormatVersion: "2010-09-09"
Paramètres:
  KeyPairName:
    Description: "La clé privée utilisée pour se connecter aux instances via SSH"
    Type: 'AWS :: EC2 :: KeyPair :: KeyName'
Ressources:
  Maître:
    Type: "AWS :: EC2 :: Instance"
    Propriétés:
      ImageId: "AMI_ID"
      InstanceType: "t2.xlarge"
      KeyName:! Ref KeyPairName
      SecurityGroupIds:
        -! Ref OpenshiftMasterSecurityGroup
        -! Ref OpenshiftInternalSecurityGroup
      BlockDeviceMappings:
        - DeviceName: "/ dev / sda1"
          Ebs:
            VolumeType: "io1"
            Iops: "200"
            DeleteOnTermination: "true"
            Taille du volume: "30"
  Node1:
    Type: "AWS :: EC2 :: Instance"
    Propriétés:
      ImageId: "AMI_ID"
      InstanceType: "t2.xlarge"
      KeyName:! Ref KeyPairName
      SecurityGroupIds:
        -! Ref OpenshiftSSHSecurityGroup
        -! Ref OpenshiftInternalSecurityGroup
      BlockDeviceMappings:
        - DeviceName: "/ dev / sda1"
          Ebs:
            VolumeType: "io1"
            Iops: "200"
            DeleteOnTermination: "true"
            Taille du volume: "30"
  Node2:
    Type: "AWS :: EC2 :: Instance"
    Propriétés:
      ImageId: "AMI_ID"
      InstanceType: "t2.xlarge"
      KeyName:! Ref KeyPairName
      SecurityGroupIds:
        -! Ref OpenshiftSSHSecurityGroup
        -! Ref OpenshiftInternalSecurityGroup
      BlockDeviceMappings:
        - DeviceName: "/ dev / sda1"
          Ebs:
            VolumeType: "io1"
            Iops: "200"
            DeleteOnTermination: "true"
            Taille du volume: "30"
  OpenshiftMasterSecurityGroup:
    Type: 'AWS :: EC2 :: SecurityGroup'
    Propriétés:
      VpcId: VPC_ID
      GroupDescription: Groupe de sécurité Openshift pour le noeud principal
      SecurityGroupIngress:
        - IpProtocol: tcp
          Depuis le port: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          Depuis le port: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          Depuis le port: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          Depuis le port: 8443
          Port: 8443
          CidrIp: 0.0.0.0/0
  OpenshiftSSHSecurityGroup:
    Type: 'AWS :: EC2 :: SecurityGroup'
    Propriétés:
      VpcId: VPC_ID
      GroupDescription: Groupe de sécurité Openshift pour SSH interne
      SecurityGroupIngress:
        - IpProtocol: tcp
          Depuis le port: 22
          ToPort: 22
          SourceSecurityGroupId:! Ref OpenshiftMasterSecurityGroup
  OpenshiftInternalSecurityGroup:
    Type: 'AWS :: EC2 :: SecurityGroup'
    Propriétés:
      VpcId: VPC_ID
      GroupDescription: Groupe de sécurité Openshift pour les nœuds internes
  Internal53TCPIngress:
    Type: 'AWS :: EC2 :: SecurityGroupIngress'
    Propriétés:
      GroupId:! Ref OpenshiftInternalSecurityGroup
      IpProtocol: tcp
      Depuis le port: 53
      ToPort: 53
      SourceSecurityGroupId:! Ref OpenshiftInternalSecurityGroup
  Internal8053TCPIngress:
    Type: 'AWS :: EC2 :: SecurityGroupIngress'
    Propriétés:
      GroupId:! Ref OpenshiftInternalSecurityGroup
      IpProtocol: tcp
      Depuis le port: 8053
      ToPort: 8053
      SourceSecurityGroupId:! Ref OpenshiftInternalSecurityGroup
  Internal8053UDPIngress:
    Type: 'AWS :: EC2 :: SecurityGroupIngress'
    Propriétés:
      GroupId:! Ref OpenshiftInternalSecurityGroup
      IpProtocol: UDP
      Depuis le port: 8053
      ToPort: 8053
      SourceSecurityGroupId:! Ref OpenshiftInternalSecurityGroup
  Internal53UDPIngress:
    Type: 'AWS :: EC2 :: SecurityGroupIngress'
    Propriétés:
      GroupId:! Ref OpenshiftInternalSecurityGroup
      IpProtocol: UDP
      Depuis le port: 53
      ToPort: 53
      SourceSecurityGroupId:! Ref OpenshiftInternalSecurityGroup
  Internal2379Ingress:
    Type: 'AWS :: EC2 :: SecurityGroupIngress'
    Propriétés:
      GroupId:! Ref OpenshiftInternalSecurityGroup
      IpProtocol: tcp
      Depuis le port: 2379
      ToPort: 2379
      SourceSecurityGroupId:! Ref OpenshiftInternalSecurityGroup
  Internal4789Ingress:
    Type: 'AWS :: EC2 :: SecurityGroupIngress'
    Propriétés:
      GroupId:! Ref OpenshiftInternalSecurityGroup
      IpProtocol: tcp
      Depuis le port: 4789
      ToPort: 4789
      SourceSecurityGroupId:! Ref OpenshiftInternalSecurityGroup
  Internal10250Ingress:
    Type: 'AWS :: EC2 :: SecurityGroupIngress'
    Propriétés:
      GroupId:! Ref OpenshiftInternalSecurityGroup
      IpProtocol: tcp
      Depuis le port: 10250
      ToPort: 10250
      SourceSecurityGroupId:! Ref OpenshiftInternalSecurityGroup

Une fois la pile de formation dans le nuage déployée avec succès, obtenez les informations suivantes,

  • Nom d'hôte public du nœud maître (nom_hôte_not_motif)
  • Nom d'hôte privé des trois nœuds (private_hostname_worker_node_1, private_hostname_worker_node_2, private_hostname_master_node)
  • Clé SSH utilisée pour la pile de formation dans le cloud (ssh_key.pem)

Jeter les bases

Nous allons exécuter les scripts Ansible à partir du nœud principal. Établissons une connexion SSH avec le nœud maître,

ssh -i ssh_key.pem centos @ public_hostname_master_node
  • Créez un fichier d'inventaire avec le contenu suivant et remplacez nom_hôte_positif_noeud_worker__1, nom_hôte_positif_node_worker_2, nom_hôte_privé_noeud, nom_hôte_public_noeud_noeud avec les valeurs correctes,
[OSEv3: enfants]
maîtrise
etcd
noeuds
[OSEv3: vars]
ansible_ssh_user = centos
ansible_sudo = true
ansible_become = true
type de déploiement = origine
os_sdn_network_plugin_name = 'redhat / openshift-ovs-multitenant'
openshift_install_examples = true
openshift_docker_options = '- activé par selinux --insecure-registry 172.30.0.0/16'
openshift_master_identity_providers = [{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider'}]
openshift_master_htpasswd_users = {'admin': '$ apr1 $ zTCG / myL $ mj1ZMOSkYg7a9NLZK9Tk9.'}
openshift_master_default_subdomain = apps.nom_hôte_public_node_master
openshift_master_cluster_public_hostname = nom_hôte_public_node_master
openshift_master_cluster_hostname = noeud_hôte_public_node
openshift_disable_check = disponibilité_disque, stockage_docker, disponibilité_mémoire
openshift_hosted_router_selector = 'node-role.kubernetes.io / infra = true'
[maîtrise]
private_hostname_master_node
[etcd]
private_hostname_master_node
[nœuds]
private_hostname_master_node openshift_node_group_name = 'node-config-master-infra' openshift_schedulable = true
private_hostname_worker_node_1 openshift_node_group_name = 'node-config-compute'
private_hostname_worker_node_2 openshift_node_group_name = 'node-config-compute'
  • Htpasswd est utilisé en tant que fournisseur d'identité et un utilisateur {Nom d'utilisateur: admin, Mot de passe: admin} est créé avec le paramètre openshift_master_htpasswd_users. Vous pouvez générer une nouvelle entrée pour un utilisateur à partir d'ici.

Nous avons besoin de deux choses pré-installées et configurées dans les instances,

  • Service Docker et service de gestion de réseau
  • Les règles SE requises pour SE Linux n’étaient pas déjà présentes et j’ai donc dû installer Container Selinux manuellement.
  • Les packages RPM Openshift Origin 3.11 ne sont pas disponibles dans le référentiel par défaut. Par conséquent, le référentiel approprié doit être configuré.

La satisfaction manuelle des exigences ci-dessus pour chaque instance n'étant pas une tâche efficace, utilisez ci-dessous le contenu et créez le script prepare.yaml Ansible pour automatiser l'installation,

Ensuite, installons quelques outils uniquement sur le nœud principal,

  • Git
miam-y installer git
  • Pip (Pour installer une version spécifique de Ansible, nous avons besoin de Pip)
miam installer epel-release
miam-y installer python-pip
  • Ansible (Version 2.6.5)
pip installer ansible == 2.6.5

Clonez ensuite le dépôt Openshift Ansible,

git clone https://github.com/openshift/openshift-ansible
cd openshift-ansible
Git checkout release-3.11

Installation ……….

Veillez à établir une connexion SSH pour tous les noms d’hôtes privés, sinon vous serez invité à ajouter ces noms d’hôte aux hôtes connus lors de l’installation. En supposant que vous soyez dans la structure de répertoire actuelle,

.
├── inventaire
├── openshift-ansible
├── prepare.yaml
└── ssh_key.pem
  1. Exécutez le script prepare.yaml,
ansible-playbook prepare.yaml -i inventaire - fichier-clé ssh_key.pem

2. Exécutez Openshift ansible prerequisites.yml,

ansible-playbook openshift-ansible / playbooks / prerequisites.yml -i inventaire - clé-fichier ssh_key.pem

3. déployer le cluster,

ansible-playbook openshift-ansible / playbooks / deploy_cluster.yml -i inventaire - clé-fichier ssh_key.pem

Un outil appelé oc est installé sur le nœud maître avec des privilèges d'administrateur de cluster permettant de gérer le cluster.

Après une installation réussie, listez les nœuds Openshift du cluster,

oc obtenir des nœuds

Vous pouvez utiliser le lien suivant pour vous connecter au cluster avec Nom d'utilisateur = admin, Mot de passe = identifiants admin,

https: // noeud_hôte_public_node: 8443 / console

Problèmes connus !!!!!

  • Si l’état «Node Join» échoue, il est possible qu’un problème survienne avec les ports ouverts en interne. Vérifiez les groupes de sécurité internes.
  • Si l'étape «Attendre la création de ServiceMonitor CRD» échoue, redémarrez le démon de docker dans le nœud Maître et réexécutez le script.
sudo systemctl docker de redémarrage